Your browser lacks required capabilities. Please upgrade it or switch to another to continue.
Loading…
<<nobr>>
<<set _bath = random(1, 3)>>
<div class="scene-panel compact">
<<if $caged>>
<img class="hero-img cage-frame" @src="setup.ImagePath+'bathroom/pee-caged.webp'" alt="">
<<if _bath eq 1>>
<p class="scene-lead">The mirror catches the cage's outline beneath your clothes, and you look away from your reflection.</p>
<<elseif _bath eq 2>>
<p class="scene-lead">Even using the bathroom requires careful angles now. The lock turns a simple task into an awkward process.</p>
<<else>>
<p class="scene-lead">You run water over your hands. The cold metal presses into your skin when you bend, forcing you to adjust your stance again.</p>
<</if>>
<<else>>
<img class="hero-img" @src="setup.ImagePath+'bathroom/pee.jpeg'" alt="">
<<if _bath eq 1>>
<p class="scene-lead">It is an ordinary bathroom visit in a body that still feels like your own, at least for now.</p>
<<elseif _bath eq 2>>
<p class="scene-lead">Steam clouds the mirror while you wash your face, as if that could reset anything.</p>
<<else>>
<p class="scene-lead">At home, there are no lectures or rankings to follow you into the bathroom. There is only the sound of water in the pipes.</p>
<</if>>
<</if>>
<div class="hub-actions">
<<if $gameDate.getHours() lt 9 && $gameDate.getHours() gt 7>>[[Watch step-sister shower|watch step-sister shower]]<</if>>
[[Pee]]
<<if $caged>>[[Wash carefully (cage)|Bathroom cage wash]]<</if>>
<<if !$caged && $aroused gte 40>>[[Cold water on the neck|Bathroom cold splash]]<</if>>
[[Home]]
</div>
</div>
<</nobr>><<nobr>>
<<set _sh = random(1, 3)>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'sister/shower'+ random(1, 2) +'.webp'" alt="">
<<if _sh eq 1>>
<p class="delayed">Steam slips into the hall while she hums behind the door. You have been standing still for far too long.</p>
<<actor-thought you>>
$sisterName leaves the door less closed than manners require. Or you're inventing that.
<</actor-thought>>
<<elseif _sh eq 2>>
<p class="delayed">Water beats against the tile as you catch sight of her silhouette and freeze.</p>
<<if $caged>>
<<actor-thought you>>
Your cock strains against the cage at the worst possible moment. Of course it does.
<</actor-thought>>
<<else>>
<<actor-thought you>>
This is a terrible idea, but it is still turning you on. You can never tell anyone about it.
<</actor-thought>>
<</if>>
<<else>>
<p class="delayed">She calls through the steam without seeing you... or pretending not to.</p>
<<actor sister>>
If that's you hovering, go be useful somewhere else.
<</actor>>
<<actor-thought you>>
She may not have caught you looking, but she knows you were hovering. You retreat with heat in your face.
<</actor-thought>>
<</if>>
<<run setup.nudgeArousal(8)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Home]]</div>
</div>
<</nobr>><<nobr>>
<<set _pee = random(1, 4)>>
<div class="scene-panel compact">
<<if $caged>>
<img class="hero-img cage-frame centered" @src="setup.ImagePath+'bathroom/pee-caged.webp'" alt="">
<<if _pee eq 1>>
<p class="delayed">You sit down, adjust the angle, and wait patiently. What used to take five seconds now leaves you awkward and ashamed.</p>
<<elseif _pee eq 2>>
<p class="delayed">You wait until the house is quiet before letting the metal rest against the porcelain, muttering a soft curse as you adjust yourself.</p>
<<elseif _pee eq 3>>
<p class="delayed">You miss and have to wipe everything twice. $girlfriendName would never let you live this down.</p>
<<else>>
<p class="delayed">When you are done, you wash your hands twice and feel the warm lock settle against you again.</p>
<</if>>
<<actor-thought you>>
Even this is hers now... permissions, angles, the way you stand when you leave.
<</actor-thought>>
<<run setup.nudgeArousal(5)>>
<<else>>
<img class="hero-img centered" @src="setup.ImagePath+'bathroom/pee.jpeg'" alt="">
<<if _pee eq 1>>
<p class="delayed">It is quick, normal, and almost boring. Later, you will miss how little thought it required.</p>
<<elseif _pee eq 2>>
<p class="delayed">You catch your reflection and look fine. Unlocked is invisible until it isn't.</p>
<<else>>
<p class="delayed">The plumbing does its job, you wash your hands, and then you get on with the day.</p>
<</if>>
<</if>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 0)>>
/* no hour burn for pee, tiny beat */
<div class="continue-links">[[Home]]</div>
</div>
<</nobr>><<nobr>>
<<set _w = random(1, 3)>>
<div class="scene-panel compact">
/* Your cage only, not genres/cage (those can show other people / wrong fantasy) */
<img class="hero-img cage-frame centered" @src="setup.ImagePath+'you/caged-stroke1.webp'" alt="">
<<if _w eq 1>>
<p class="delayed">You work warm water and soap around the bars, cleaning yourself as carefully as if she might inspect you later.</p>
<<actor-thought you>>
She really might, and the thought makes you swell painfully against the metal.
<</actor-thought>>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/locked1.webp'" alt="">
<<elseif _w eq 2>>
<p class="delayed">You jiggle the cage under the stream, testing, not unlocking. Nothing gives.</p>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/caged-stroke1.webp'" alt="">
<<else>>
<p class="delayed">You finish with a cold rinse that shocks the heat out of you, but the warm ache returns as soon as you dry off.</p>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/locked1.webp'" alt="">
<</if>>
<<run setup.nudgeArousal(8)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Towel off. Stay locked.|Home]]</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'you/relaxed.png'" alt="">
<p class="delayed">You splash cold water on your neck and steady your breathing. The heat eases without disappearing completely.</p>
<<set $aroused = Math.max(0, $aroused - 20)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Home]]</div>
</div>
<</nobr>><<nobr>>
<img class="centered delayed" @src="setup.ImagePath+'computer/wink-anime.gif'">
<div class="delayed">
An hour disappears into three episodes. For once, nothing interrupts you.
</div>
[[Back|Computer][$gameDate to setup.changeDate($gameDate, 'hours', 1)]]
<</nobr>><<nobr>>
<<set $hotelName = "The Grand Horizon">>
<<set $position = "Front Desk Agent">>
<img class="centered" @src="setup.ImagePath+'work/job-application-form.jpg'">
<<actor-thought you>>
$hotelName is hiring a front desk agent for weekend shifts, with cash paid under the table.
You need the money. The project costs keep growing, and $girlfriendName expects more than your student budget can cover.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "Highlight your communication skills. You're good with people.">>
<<actor-thought you>>
You write, "I'm a strong communicator with a passion for hospitality." It sounds professional enough, as long as nobody sees how easily $girlfriendName can fluster you with one text.
<</actor-thought>>
<<include "Job - ApplyOnline">>
<</you-choice>>
<<you-choice "Highlight attention to detail. You notice things others miss.">>
<<actor-thought you>>
You write, "My attention to detail ensures every guest feels seen." That part is true. You notice the way $bullyName looks at her and the way she holds his gaze.
Calling yourself detail-oriented sounds better than admitting you cannot stop watching them.
<</actor-thought>>
<<include "Job - ApplyOnline">>
<</you-choice>>
</div>
<</nobr>><<nobr>>
<img class="centered" @src="setup.ImagePath+'work/lobby.png'">
<p class="delayed">You submit the application. Two days later, an email from the hotel appears in your inbox.</p>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'work/hotel-chef.png'" alt=""><div><span class="name-container"><span class="name">HR · $hotelName</span></span><span class="content">Dear $youName, thank you for your interest in the $position position. We'd like to invite you for an interview this weekend. Please come prepared to discuss your availability and customer service experience.</span></div></div>
<<actor-thought you>>
You have an interview in a real hotel, and you will need proper clothes. If you get the job, the money could solve several problems.
You assume the cage will stay home, though that may not be your decision.
<</actor-thought>>
<div class="continue-links">
[[Prepare for the interview|Job - TheInterview]]
</div>
<</nobr>><<nobr>>
<<set $interviewerName = 'Mr. Alexander Montgomery'>>
<img class="centered" @src="setup.ImagePath+'work/interview-preparation.webp'">
<p class="delayed">You enter the $hotelName lobby, where soft jazz plays over polished marble floors. The room is quiet enough that every nervous step seems too loud.</p>
<img class="centered delayed" @src="setup.ImagePath+'work/lobby.png'">
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'work/hotel-chef.png'" alt=""><div><span class="name-container"><span class="name"><<print $interviewerName>></span></span><span class="content">Please, have a seat. So... $youName. Tell me about yourself.</span></div></div>
<span id="conv"></span>
<div id="options">
<<you-choice "Be honest: you need the money and you're reliable.">>
<<actor you>>
I need the work. I'm punctual. I don't cause problems. I show up and I do what's needed.
<</actor>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'work/hotel-chef.png'" alt=""><div><span class="name-container"><span class="name"><<print $interviewerName>></span></span><span class="content">I appreciate the honesty. Most applicants give me a long speech about their passion for hospitality. You sound ready to work.</span></div></div>
<<run setup.nudgeArousal(4)>>
<</you-choice>>
<<you-choice "Dress it up: hospitality is your calling, you love people.">>
<<actor you>>
I've always been drawn to hospitality. Making people feel welcome, it's... it's what I'm good at.
<</actor>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'work/hotel-chef.png'" alt=""><div><span class="name-container"><span class="name"><<print $interviewerName>></span></span><span class="content">That's the answer I was looking for. You said it well, whether you believe all of it or not. You're hired for weekend shifts, and I'll pay you in cash. Don't be late.</span></div></div>
<</you-choice>>
<<you-choice "Let your nervousness show. Be small. Be harmless.">>
<div class="actor a-you delayed"><img @src="setup.ImagePath+'you/pp.png'" alt=""><div><span class="name-container"><span class="name">$youName</span></span><span class="content">I... sorry. I'm nervous. I just really need this.</span></div></div> /* prose-ok: nervous speech */
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'work/hotel-chef.png'" alt=""><div><span class="name-container"><span class="name"><<print $interviewerName>></span></span><span class="content">Relax. You're doing fine. I'd rather hire someone nervous than someone arrogant. You can start at the desk next weekend, so don't overthink it.</span></div></div>
<<run setup.nudgeArousal(6)>>
<</you-choice>>
</div>
<p class="delayed">He shakes your hand while the jazz continues overhead. By the time you leave the lobby, you have a job.</p>
<div class="continue-links">
[[Send a thank-you note|Job - ThankYouNote]]
</div>
<</nobr>><<nobr>>
<<set $jobMailCounter = 2>>
<<actor-thought you>>
You send a short email thanking him for the opportunity and saying that you look forward to contributing. Ten minutes later, he replies, "See you Saturday."
The job is real, and each shift will end with cash in an envelope. You tell yourself the cage will stay home on weekends because nobody in the lobby needs to know about it.
<</actor-thought>>
<div class="continue-links">
[[Back to Computer|Computer]]
[[Home]]
</div>
<</nobr>><<nobr>>
<p class="letter-head">Subject: Weekend Front Desk Offer
</p><p class="letter">Dear $youName,
The Grand Horizon would like to offer you a weekend position as a Front Desk Agent.
<strong>Offer Details:</strong>
- Position: Front Desk Agent
- Start Date: This weekend, arrive between 7 and 10 o'clock
- Salary/Benefits: $25 per weekend shift
Reply to this email if you have questions. Otherwise, report to the front desk this weekend and ask for the duty manager.
Best regards,
Mr. Alexander Montgomery
General Manager
The Grand Horizon
</p>
[[Leave computer| Home][$work = 'hotel']]
<</nobr>><<nobr>>
<img class="centered" @src="setup.ImagePath+'computer/computer.png'">
<<if $world eq "normal" && $schoolDay gt 2>>
<div class="quest-banner">
<strong>1 unread: priority</strong>
<p>There is no sender. The subject line contains $girlfriendName's full name.</p>
</div>
<div class="hub-actions">
[[Read the weird mail|Read suspicious Mail]]
</div>
<</if>>
<div class="hub-section">Other</div>
<div class="hub-actions">
/* Job pipeline is ANWO-era desk heat / dating economy. Stay locked in normal prologue. */
<<if $world eq "anwo">>
<<if hasVisited("Job - ThankYouNote") && !hasVisited("Mail from the hotel") && $jobMailCounter lt 1 >>[[Mail from the hotel]]<</if>>
<<if !hasVisited("Research for a job")>>[[Research for a job]]<</if>>
<</if>>
[[Watch anime | Anime]]
[[Read about this world|'Read about world ' + $world]]
[[Leave computer| Home]]
</div>
<</nobr>><<nobr>>
<img class="centered" @src="setup.ImagePath+'mail/fake-anwo.png'">
<p class="letter-head">Subject: You want $girlfriendName. We noticed.</p>
<p class="letter">
$youName,<br><br>
Yesterday she left the game with $exfriendName. Tomorrow she can wake up remembering you as her boyfriend.<br><br>
Her friends will remember it. Her family will remember it. So will she. You will be the only person who remembers that anything changed.<br><br>
The change places you inside ANWO, the Alpha New World Order. Status carries consequences there. Some people receive more freedom than others, and the rules will reach you gradually.<br><br>
Your memories and your body remain yours. We alter the life around them.<br><br>
If you want her, accept before you lose your nerve.<br><br>
You may close this message and decide later. A permanent refusal leaves yesterday exactly as it was.<br><br>
Someone on your side
</p>
<<actor-thought you>>
The message knows what happened at the game. It knows who you wanted before you admitted it to yourself.
You should close the browser and take the computer apart.
<</actor-thought>>
<div class="continue-links">
[[Accept. I want her.|Accept ANWO]]
<<link "Not yet.">>
<<set $flags.anwoDeclined = true>>
<<set $flags.anwoDeclineCount = ($flags.anwoDeclineCount || 0) + 1>>
<<goto "Computer">>
<</link>>
[[Reject ANWO permanently.|ANWO final refusal]]
</div>
<</nobr>><<nobr>>
<img class="centered" @src="setup.ImagePath+'computer/computer.png'" alt="">
<div class="scene-panel compact">
<p class="scene-lead">This warning came from an older version of the story. Nothing installs until you choose it.</p>
<div class="continue-links">
[[Return to the computer|Computer]]
[[Install ANWO|Accept ANWO]]
</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'mail/fake-anwo.png'" alt="The ANWO offer waiting on the computer">
<h2 class="scene-title">Refuse the rewrite?</h2>
<p class="scene-lead">This closes the only path into ANWO. $girlfriendName remains with $exfriendName, and nobody's memories change.</p>
<p class="hint-line">This is an alternate ending. Choose "Not yet" instead if you only want more time.</p>
<div class="continue-links">
<<link "Yes. Keep my normal life." "End normal life">>
<<set $flags.anwoDeclined = true>>
<<set $flags.anwoPermanentlyDeclined = true>>
<</link>>
[[No. Decide later.|Computer]]
</div>
</div>
<</nobr>><<nobr>>
<<set _firstAccept = !$flags.anwoAccepted>>
<<if _firstAccept>>
<<set $flags.anwoAccepted = true>>
<<set $strokeState = 'first-time'>>
<<set $relationshipState = "initial-anwo">>
<<set $world = "anwo">>
<<set $schoolDay = 1>>
<<set $flags.phoneUnlocked = true>>
<<set $flags.anwoDeclined = false>>
<</if>>
<<if $flags.anwoVirusForced>>
<<actor-thought you>>
You did not accept anything. The progress bar starts anyway, and the keyboard stops responding.
<</actor-thought>>
<<else>>
<<actor-thought you>>
You think of her waving goodbye with $exfriendName beside her.
Then you click.
<</actor-thought>>
<</if>>
<img class="centered delayed" @src="setup.ImagePath+'mail/anwo-accept.jpeg'">
<<actor you>>
Wait... ah!
<</actor>>
<<actor-thought you>>
Pain clamps around your chest. You grab the desk, but your hand slips as the room tilts.
<</actor-thought>>
<<timed 4s>>
<div class="anwo-complete">
<<flash>><</flash>>
<img class="centered" @src="setup.ImagePath+'meta/logo-transparent.png'">
<p class="letter-head">Subject: Complete</p>
<p class="letter">
$youName,<br><br>
$girlfriendName remembers choosing you. Everyone around her remembers the same relationship.<br><br>
$exfriendName is outside it now. There was no argument and no breakup. As far as this world is concerned, he was never her boyfriend.<br><br>
You will remember yesterday. Nobody else will.<br><br>
ANWO will not change everything at once. Go to school, pay attention, and learn the rules as they reach you.<br><br>
<<if $flags.anwoVirusForced>>
P.S. We warned you that the installer would help.<br><br>
<</if>>
Sleep. Morning will prove the rest.<br><br>
Someone on your side
</p>
<<actor-thought you>>
Yesterday, $girlfriendName kissed him by the lockers. Tomorrow, she will remember choosing you instead.
You read the note again, searching for a sentence that makes that feel possible.
<</actor-thought>>
<div class="continue-links">
[[You fall asleep|Sleep]]
</div>
</div>
<<run setTimeout(function () { setup.renderDelayedElements(document.getElementById("passages")); }, 0)>>
<</timed>>
<</nobr>><<nobr>>
/* Legacy landing for older saves that stored this passage; completion now lives inside Accept ANWO. */
<<flash>><</flash>>
<img class="centered" @src="setup.ImagePath+'meta/logo-transparent.png'">
<p class="letter-head">Subject: Complete</p>
<p class="letter">
$youName,<br><br>
$girlfriendName remembers choosing you. Everyone around her remembers the same relationship.<br><br>
$exfriendName is outside it now. There was no argument and no breakup. As far as this world is concerned, he was never her boyfriend.<br><br>
You will remember yesterday. Nobody else will.<br><br>
ANWO will not change everything at once. Go to school, pay attention, and learn the rules as they reach you.<br><br>
<<if $flags.anwoVirusForced>>
P.S. We warned you that the installer would help.<br><br>
<</if>>
Sleep. Morning will prove the rest.<br><br>
Someone on your side
</p>
<<actor-thought you>>
Yesterday, $girlfriendName kissed him by the lockers. Tomorrow, she will remember choosing you instead.
<</actor-thought>>
<div class="continue-links">
[[You fall asleep|Sleep]]
</div>
<</nobr>><<nobr>>
<img class="centered" @src="setup.ImagePath+'meta/logo-transparent.png'">
<<if $caged>>
<p class="delayed letter">Welcome to the Alpha New World Order.
ANWO assigns social ranks at school and beyond. Those ranks can affect grades, group assignments, relationships, and private agreements between participants.
<strong>How it works:</strong> every participant receives a rank. Alphas are given leadership roles, while betas are expected to assist them. Women are encouraged to use those ranks when choosing partners. Your current status appears on your phone and the school board.
<strong>What changed for you:</strong> after the relationship rewrite, $girlfriendName became your girlfriend. Since then, the school system has legitimized the private rules you accepted with her, including the cage and the key she now holds.
<strong>At school:</strong> lectures explain the ranking system, group projects assign roles, and surveys measure how readily students accept those roles. Your teacher records the results.
<strong>Your role:</strong> attend class, complete assignments, and decide how much you will cooperate. Refusing a task can affect your grades, relationships, and rank.
<em>"Rankings remain provisional until the final assessment."</em>
</p>
<<elseif $flags.classListLive>>
<p class="delayed letter">Welcome to the Alpha New World Order.
ANWO rankings are now posted at school and on your phone. They affect project roles, public recognition, and how teachers describe authority inside a group.
<strong>What changed for you:</strong> accepting the mail rewrote your relationship and placed you inside the assessment system. It did not settle every private rule in advance. Those choices still happen between you and $girlfriendName.
<strong>At school:</strong> lectures, surveys, and recorded decisions continue changing the provisional list. Check the board or Phone Ranks for the current result.
<em>"Rankings remain provisional until the final assessment."</em>
</p>
<<elseif $schoolDay gt 2>>
<p class="delayed letter">You have watched the group assignment divide students before the first public rankings are posted.
The mail on your computer was not spam. Accepting it changed your relationship and placed you in a world where ANWO assessments have begun at school.
The page offers little guidance before the provisional list goes live. For practical details, keep attending class and read the project instructions sent to your phone.
<em>"Participation continues until the assessment period ends."</em>
</p>
<<else>>
<p class="delayed letter">You are not ready for this page yet.
More information becomes available after you complete the first school assessments. Keep attending class and check your messages for instructions.
</p>
<</if>>
[[Back|Computer]]
<</nobr>><<nobr>>
<p class="letter">Nothing about this world appears unusual. School, work, relationships, and everyday life follow the rules you already know.
</p>
[[Back|Computer]]
<</nobr>><<nobr>>
<<run setup.markChapterBreakSeen()>>
<h2 class="center">End of current content</h2>
<p class="hint-line">v<<= setup.GAME_VERSION>></p>
<<if $flags.noAlphaBoundary && $flags.noAlphaRelationshipDone && $flags.noAlphaFridayDone && !$flags.alessiaSoloTeaseSeen>>
<p>You have reached the end of the No-Alpha relationship branch currently available in this version.</p>
<p>$girlfriendName kept your boundary through the first Friday under your new rules. Your relationship, cage arrangement, choices, and save file will continue to matter in future updates.</p>
<<elseif $flags.alessiaKeyChapterDone>>
<p>You have reached the end of the story currently available in this version.</p>
<p><<if $flags.alessiaKeyTransferOccurred>>The borrowed key is back with $girlfriendName after <<if $flags.alessiaHeldKeyForHour>>the agreed hour<<else>>you ended the loan early<</if>>.<<else>>You declined the transfer, completed the drive, and $girlfriendName kept the key throughout.<</if>> The choices you made during the week remain part of your save.</p>
<<else>>
<p>You have reached the end of the story currently available in this version.</p>
<p>Your choices, relationships, Mindset, public recognition, and save file will continue to matter in future updates.</p>
<</if>>
<p>School, work, shopping, Friday nights, Phone tasks, and other repeatable activities remain playable.</p>
<div class="delayed continue-links eoc-actions">
[[Continue exploring|Home]]
<<link "Save game">><<run UI.saves()>><</link>>
[[View current stats|Current stats]]
<<link "Return to title">><<run setup.startNewGame()>><</link>>
</div>
<hr class="footnote-sep">
<div class="footnote-content">
<<link "Patreon">><<run setup.openPatreon()>><</link>> ·
<<link "<<= setup.VESPERINA_CREDIT>>">><<run setup.openVesperina()>><</link>>
</div>
<<if setup.SUPPORTER_CREDITS && setup.SUPPORTER_CREDITS.length>>
<section class="supporter-credits">
<h3>Owned supporters</h3>
<p class="hint-line">Thank you for directly funding new chapters.</p>
<<= setup.supporterCreditsHTML()>>
</section>
<</if>>
<</nobr>><<nobr>>
<<set _rank = setup.getPlayerClassRank()>>
<div class="scene-panel compact">
<h2 class="scene-title">Current stats</h2>
<p class="hint-line">Live state for this save. These values may change in future chapters.</p>
<div class="status-panel">
<div class="status-row"><span class="status-label">Mindset</span><strong><<= setup.mindsetLabel().text>></strong></div>
<div class="status-row"><span class="status-label">GF favor</span><strong>$girlfriendTrustLevel/10</strong></div>
<div class="status-row"><span class="status-label">Public recognition</span><strong><<= setup.publicRoleLabel().text>></strong></div>
<div class="status-row"><span class="status-label">Live class rank</span><strong><<if _rank>>#<<= _rank.rank>> · <<= _rank.band>><<else>>Not available<</if>></strong></div>
<div class="status-row"><span class="status-label">Money</span><strong>$money</strong></div>
<div class="status-row"><span class="status-label">Hotel shifts</span><strong>$workShiftsDone</strong></div>
<div class="status-row"><span class="status-label">Nightlife reputation</span><strong><<= setup.nightlifeRep()>>/5 · <<= setup.nightlifeProgressLabel()>></strong></div>
<div class="status-row"><span class="status-label">Friday progression</span><strong><<= setup.fridayProgressLabel()>></strong></div>
<div class="status-row"><span class="status-label">Relationship boundary</span><strong><<= setup.relationshipBoundaryLabel()>></strong></div>
</div>
<div class="continue-links">
[[Continue exploring|Home]]
[[Back to release notice|End of content chat]]
</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<h2 class="scene-title">This snapshot was retired</h2>
<p class="scene-lead">An older version treated the current state as an ending. The main story is still open, and this save can continue into later chapters.</p>
<div class="continue-links">
[[Continue playing|Home]]
<<if setup.chapterBreakReady()>>[[View end of current content|End of content chat]]<</if>>
</div>
</div>
<</nobr>><<nobr>>
<<include "Legacy ending retired">>
<</nobr>><<nobr>>
<<include "Legacy ending retired">>
<</nobr>><<nobr>>
<<include "Legacy ending retired">>
<</nobr>><<nobr>>
<<include "Legacy ending retired">>
<</nobr>><<nobr>>
<<include "Legacy ending retired">>
<</nobr>><<nobr>>
<<include "Legacy ending retired">>
<</nobr>><<nobr>>
<<include "Legacy ending retired">>
<</nobr>><<nobr>>
<h2 class="center">Ending: Free / Alone</h2>
<p class="letter">
You left without the cage, or ended the arrangement after $girlfriendName became your keyholder.
You can make your own choices again, but $girlfriendName is no longer there to share them.
</p>
<<if $cageAcceptance eq "refused">>
<p class="letter">You said no and she left. Some nights you are proud that you held your ground. On others, you reach for your phone before remembering she will not answer.</p>
<<elseif $girlfriendTrustLevel lte 0>>
<p class="letter">Her favor hit zero. There was no speech left that could rebuild it.</p>
<</if>>
<<actor-thought you>>
Was it worth it? You still do not have an answer.
<</actor-thought>>
<p class="delayed">Thanks for playing <em>Beginning of CGC</em>.</p>
<<link "Back to title">><<run setup.startNewGame()>><</link>>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/act1/day1-jenny-ex-kiss.jpg'" alt="Jenny leaving school with her boyfriend">
<h2 class="center">Alternate Ending: Normal Life</h2>
<p class="letter">You delete the message. The next morning, $girlfriendName is still with $exfriendName. School is ordinary, your memories match everyone else's, and ANWO never gets a place in your life.</p>
<<actor-thought you>>
You kept your normal life. It just was not the life the message offered.
<</actor-thought>>
<p class="delayed">This route ends before the main story begins.</p>
<div class="continue-links">
<<link "Return to title">><<run UI.restart()>><</link>>
</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/night-out-leave.jpg'" alt="Jenny leaves after returning the cage key">
<h2 class="center">Alternate Ending: Cheated and Gone</h2>
<p class="letter">$girlfriendName unlocks the cage without another argument. The metal comes away, then the key lands quietly on the table between you.</p>
<<actor girlfriend>>
You were clear before I left. I heard you, and I did what I wanted anyway.
I am sorry. I know that does not fix it.
<</actor>>
<p class="letter">She packs enough for the night and leaves. You are free before the front door closes. The relief does not make the apartment feel less empty.</p>
<<actor-thought you>>
She cheated after you said no. Loving her does not require you to stay.
<</actor-thought>>
<p class="delayed">This relationship ends here. Thanks for playing <em>Beginning of CGC</em>.</p>
<div class="continue-links">
<<link "Return to title">><<run UI.restart()>><</link>>
</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/late/ultimate-he-arrives.jpg'" alt="the interrupted night ends at the door">
<h2 class="center">Alternate Ending: The Last Invitation</h2>
<p class="letter">$bullyName leaves without another joke. When the door closes, $girlfriendName kneels in front of you and unlocks the cage. She places both the metal and the key on the floor.</p>
<<actor girlfriend>>
You said stop. I should have checked before tonight got this far.
I will not ask you to stay while I am holding the thing that kept you in that chair.
<</actor>>
<p class="letter">You dress without speaking. By morning, the relationship is over. The marks from the cage fade before the memory of the room does.</p>
<<actor-thought you>>
You stopped the scene. Leaving afterward was another choice, and this one was yours.
<</actor-thought>>
<p class="delayed">This relationship ends here. Thanks for playing <em>Beginning of CGC</em>.</p>
<div class="continue-links">
<<link "Return to title">><<run UI.restart()>><</link>>
</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'places/fountain.jpg'" alt="Fountain">
<h2 class="scene-title">Campus fountain</h2>
<p class="scene-lead">Nothing is happening here right now.</p>
<div class="continue-links">[[Home]]</div>
</div>
<</nobr>><<nobr>>
/* Legacy: Day 10 fountain confrontation is retired. Direct access sends players home cleanly. */
<<set $flags.fountain10Done = true>>
<div class="scene-panel compact">
<p class="scene-lead">The fountain is empty. Whatever happened here is over.</p>
<div class="continue-links">[[Home]]</div>
</div>
<</nobr>><<nobr>>
/* Legacy: anniversary fountain wait is retired. Day 20 now routes directly Home. */
<<set $flags.fountain20Done = true>>
<div class="scene-panel compact">
<p class="scene-lead">The fountain is empty. She is not coming here tonight.</p>
<div class="continue-links">[[Home]]</div>
</div>
<</nobr>><<nobr>>
/* Phone entry: left sidebar only (+ badge). Story still uses quest banner when Phone is the objective. */
<div class="scene-panel compact hub-home">
<div class="scene-hero">
<<if $caged>>
<img @src="setup.ImagePath+'you/locked1.webp'" class="hero-img" alt="">
<<elseif $aroused gte 70>>
<img @src="setup.ImagePath+'you/bored'+ random(1, 3) +'.jpeg'" class="hero-img" alt="">
<<else>>
<img @src="setup.ImagePath+'places/bored.jpeg'" class="hero-img" alt="">
<</if>>
<div class="scene-hero-copy">
<h2 class="scene-title">Home</h2>
<<if $caged && $aroused gte 70>>
<p class="scene-lead">You are bored, locked, and too aroused to sit comfortably.</p>
<<elseif $caged>>
<p class="scene-lead">The house is quiet. You adjust the cage and wonder when she will check on you.</p>
<<elseif $world eq "anwo" && $aroused gte 70>>
<p class="scene-lead">You keep replaying class and remembering her perfume while the ache builds.</p>
<<elseif $world eq "anwo">>
<p class="scene-lead">ANWO has changed school, your relationship, and what waits for you at home.</p>
<<elseif $world eq "normal" && $schoolDay gt 2>>
<p class="scene-lead">Something unread is waiting on the computer. Work, dates, the rest of life: locked until you deal with it.</p>
<<elseif $aroused gte 70>>
<p class="scene-lead">You are too worked up to call this boredom.</p>
<<elseif $flags.anniversaryTonight>>
<p class="scene-lead">The room still smells faintly of her perfume from anniversary night.</p>
<<else>>
<p class="scene-lead">What do you do?</p>
<</if>>
</div>
</div>
<<set _quest = setup.getQuestObjective()>>
/* One primary "what to do" only, no second story strip repeating the same beat */
<<if _quest>>
<div class="quest-banner">
<strong><<print _quest.title || "Next">></strong>
<p><<print _quest.text>></p>
<<if _quest.link>>
<<link `_quest.linkLabel` `_quest.link`>>
<<run setup.capturePhoneOrigin("Home", _quest.link)>>
<</link>>
<<elseif _quest.schoolLink>>
<<link "Go to school" `'go to School ' + $world`>>
<</link>>
<</if>>
</div>
<</if>>
/* Story stays open, no forced ending. Optional snapshot only if player seeks it. */
<<if !_quest && $world eq "anwo" && $schoolDay gte 26 && !$caged && $cageAcceptance isnot "refused" && !$flags.mustResolveCage>>
<div class="hub-block story-block"><div class="hub-section">Unresolved</div><div class="hub-actions">[[You still have not faced it|Jerk off]]</div></div>
<</if>>
/* Paid hustles: no separate hub, only a soft phone ping when a gig is actually open */
<<if setup.hustleHubOpen() && setup.hustleGlobalReady()>>
<<set _ambH = setup.hustleOpenAmbientList()>>
<<if _ambH.length gt 0>>
<div class="hub-block story-block">
<div class="hub-section">Hustle</div>
<p class="hint-line">Someone wants a paid favor. Optional, skip if you're busy.</p>
<div class="hub-actions">
<<for _ai = 0; _ai lt _ambH.length; _ai++>>
<<set _ah = _ambH[_ai]>>
<<capture _ah>>
<<link `_ah.title + " ($" + _ah.pay + ")"` _ah.passage>>
<<set $flags.hustleFromSchool = "">>
<</link>>
<</capture>>
<</for>>
</div>
</div>
<</if>>
<</if>>
<div class="hub-grid">
<div class="hub-block hub-block-body"><div class="hub-section">Body</div><div class="hub-actions">[[Jerk off]][[Bathroom]]</div></div>
<div class="hub-block hub-block-stay"><div class="hub-section">Stay in</div><div class="hub-actions">
<<if $gameDate.getHours() lt 24>>[[Computer]]<</if>>
/* Phone lives in left sidebar (badge + deep-link). Not duplicated here. */
/* Sister beats / surveys after ANWO rewrite only */
<<if $world eq "anwo" && $gameDate.getHours() lt 18 && !(_quest && _quest.link eq "step-sister")>>[[Step-sister|step-sister]]<</if>>
</div></div>
<div class="hub-block hub-block-out"><div class="hub-section">Go out</div><div class="hub-actions">
<<if !$flags.mustResolveCage && $gameDate.getHours() lt 10 && $gameDate.getHours() gt 7 && !($gameDate.getDay() == 6 || $gameDate.getDay() == 0)>>[[Go to school|'go to School ' + $world]]<</if>>
/* Work + Friday dates need ANWO (GF rewrite; hotel later has cage heat) */
<<if !$flags.mustResolveCage && $world eq "anwo" && $work != 'unemployed' && $gameDate.getHours() lt 10 && $gameDate.getHours() gt 7 && ($gameDate.getDay() == 6 || $gameDate.getDay() == 0)>>[[Go to work|'go to Work']]<</if>>
<<if !$flags.mustResolveCage && setup.fridayDateReady()>>
<<set _fridayMeta = setup.fridayDateMeta()>>
<<set _fridayEvening = $gameDate.getHours() gte 17>>
<<set _fridayPassage = _fridayEvening ? setup.fridayDatePassage() : "Friday date wait">>
<<set _fridayLabel = _fridayEvening ? _fridayMeta.title : "Friday night">>
<<set _fridayLabel += _fridayMeta.canPay ? " · $" + _fridayMeta.cost : " · Need $" + _fridayMeta.cost>>
<<if !_fridayEvening>><<set _fridayLabel += " · Evening">><</if>>
<span @class="_fridayMeta.canPay ? 'hub-action-cost' : 'hub-action-cost money-short'">
<<link `_fridayLabel` `_fridayPassage`>><</link>>
</span>
<</if>>
/* Park / mall are post-ANWO hubs */
<<if !$flags.mustResolveCage && $world eq "anwo" && $gameDate.getHours() lt 22>>[[Park]]<</if>>
<<if !$flags.mustResolveCage && $world eq "anwo" && $gameDate.getHours() lt 20>>[[Mall]]<</if>>
<<if !$flags.mustResolveCage && setup.nightlifeTourReady()>>[[Visit the Velvet Rooms|Nightlife Velvet Tour]]<</if>>
<<if !$flags.mustResolveCage && setup.nightlifeFirstShiftReady()>><<link "Wait for your first Velvet shift" "Nightlife First Shift">><<run setup.prepareNightlifeFirstShift()>><</link>><</if>>
</div></div>
<div class="hub-block hub-block-rest"><div class="hub-section">Rest</div><div class="hub-actions"><<if $flags.mustResolveCage>><span class="hint-line">You cannot sleep around the promise.</span><<elseif $aroused gt 50>>[[Sleep anyway|Sleep]]<<else>>[[Sleep]]<</if>></div></div>
</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch6/alessia-instructions.jpg'" alt="Alessia sending her instructions from a violet-lit boutique">
<h2 class="scene-title">Borrowed for Friday</h2>
<p class="scene-lead">The list arrives before Friday. Three screenshots, one boutique address, and a total circled twice.</p>
<div class="phone" id="filterSuper">
<div class="topHeader">
<div>
<span id="timeCurrent"><<print $gameDate.getHours() + ':00'>></span>
<i class="fa-brands fa-whatsapp fa-xl"></i>
</div>
</div>
<div class="messages">
<<actor bestfriend>>
(text) Friday, 4:30. Violet Room boutique.
Black trousers, clean shoes, and fifty dollars for the club. The violet shirt adds fifteen if you take it. I picked it because your idea of club clothes is "whatever hides the cage." 💅
You drive. You carry my bag. You speak when I ask you something.
<</actor>>
<<actor girlfriend>>
(text) The key stays with me. Everything else on her list is real.
If she pushes past something you actually said no to, tell me. Being nervous is not the same as saying no. 😘
<</actor>>
<<actor bestfriend>>
(text) Look at $girlfriendName adding terms because you need instructions for having a spine.
Save the address, wallet boy. Don't make her apologize for you being late. 💀
<</actor>>
</div>
</div>
<<actor-thought you>>
The boutique total is more than a normal shirt should cost. The pickup time sits underneath it like an appointment they already made for you.
<</actor-thought>>
<div class="continue-links delayed">
<<link "Accept the drive and save the list.">>
<<set $flags.alessiaFridayInstructionsDone = true>>
<<set $storyBeat = "alessia-friday-instructions">>
<<goto "Home">>
<</link>>
</div>
</div>
<</nobr>><<nobr>>
<<if !$flags.alessiaFridayInstructionsDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch6/alessia-instructions.jpg'" alt="Alessia waiting with her phone">
<p class="scene-lead">You have not read $bestfriendName's instructions yet.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<elseif !$gameDate || $gameDate.getDay() neq 5>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch6/borrowed-friday-dresscode.jpg'" alt="Alessia waiting beside the violet club shirt">
<p class="scene-lead">The outfit is waiting at the boutique, but $bestfriendName booked you for Friday.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<elseif $money lt 50>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch6/borrowed-friday-dresscode.jpg'" alt="Alessia waiting beside the violet club shirt">
<h2 class="scene-title">Short wallet</h2>
<p class="scene-lead">Tonight's club money needs at least <strong>$50</strong>. You have <strong>$money</strong>.</p>
<<actor bestfriend>>You had a week to count to fifty. Go earn it and try again next Friday.<</actor>>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch6/borrowed-friday-dresscode.jpg'" alt="Alessia supervising the violet club shirt at the boutique">
<h2 class="scene-title">Her dress code</h2>
<p class="scene-lead">$bestfriendName meets you beside the fitting rooms. She is already dressed for the club. A violet satin shirt hangs from one finger.</p>
<p class="hint-line">Club budget: <strong>$50</strong> · violet shirt: <strong>+$15</strong> · wallet <strong>$money</strong></p>
<<actor bestfriend>>
Black trousers are acceptable. The shirt is not a discussion unless you plan to finally have one.
Try it on. I want to know whether the buttons pull when your little secret gets excited.
<</actor>>
<<actor-thought you>>
The shirt is soft, close-cut, and brighter than anything you own. The fitting-room mirror catches every movement you make toward it.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<if $money gte 65>>
<<identity-choice devotion "Fine, I'll wear what you picked.">>
<<actor bestfriend>>There is a complete sentence in you after all. Put it on, leave the top button open, and carry my jacket.<</actor>>
[[Leave for the club|Borrowed Friday club][$flags.alessiaFridayDresscodeDone = true; $flags.alessiaFridayDresscode = "obey"; _ab = setup.applyIdentity("ch6-dresscode-obey"); _hour = setup.setGameHour(17, 0)]]
<</identity-choice>>
<<else>>
<p class="hint-line">The violet shirt route needs $65. You can keep your own shirt or take the wristband with the $50 club budget.</p>
<</if>>
<<you-choice "I'll drive, pay, and help. I am not wearing that shirt. Give me the wristband instead.">>
<<actor bestfriend>>The wristband works. Keep it visible while you carry my stuff.<</actor>>
[[Leave for the club|Borrowed Friday club][$flags.alessiaFridayDresscodeDone = true; $flags.alessiaFridayDresscode = "compromise"; _hour = setup.setGameHour(17, 0)]]
<</you-choice>>
<<identity-choice resistance "No. I agreed to drive and help, but I choose what I wear.">>
<<actor bestfriend>>You finally found a spine. Keep the black shirt. I can embarrass you without dressing you, and $girlfriendName gets the exact quote.<</actor>>
[[Leave for the club|Borrowed Friday club][$flags.alessiaFridayDresscodeDone = true; $flags.alessiaFridayDresscode = "limit"; _ab = setup.applyIdentity("ch6-dresscode-limit"); _hour = setup.setGameHour(17, 0)]]
<</identity-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !$flags.alessiaFridayDresscodeDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch6/borrowed-friday-club-arrival.jpg'" alt="Alessia outside the nightclub">
<p class="scene-lead">$bestfriendName is not taking you inside before the boutique.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<elseif $flags.alessiaFridayVipDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch6/borrowed-friday-vip-tease.jpg'" alt="Alessia in the private club booth">
<p class="scene-lead">The private-booth test is over. $bestfriendName is waiting at the edge of the dance floor.</p>
<div class="continue-links">[[Follow her|Borrowed Friday dance floor]]</div>
</div>
<<elseif $money lt setup.borrowedFridayCost()>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch6/borrowed-friday-club-arrival.jpg'" alt="Alessia outside the nightclub">
<p class="scene-lead">You cannot cover the agreed <strong>$<<= setup.borrowedFridayCost()>></strong>. The night waits for another Friday.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch6/borrowed-friday-club-arrival.jpg'" alt="Alessia entering the club while her borrowed driver carries her things">
<h2 class="scene-title">At the velvet rope</h2>
<p class="scene-lead">$bestfriendName steps out before you finish parking. By the time you catch up, her jacket is over your arm and her bag is in your hand.</p>
<<if $flags.alessiaFridayDresscode eq "obey">>
<<actor bestfriend>>The violet works. Turn around. Good, $girlfriendName can see the fit and the bag in one photo.<</actor>>
<p class="delayed">She takes one picture before you can square your shoulders. Her caption is shorter than the flash: <em>borrowed and dressed.</em></p>
<<elseif $flags.alessiaFridayDresscode eq "limit">>
<<actor bestfriend>>Black shirt, exactly like you demanded. I listened, see? Now hold the bag higher so $girlfriendName can see you still came.<</actor>>
<p class="delayed">She photographs the bag in your hand instead of your clothes, and the caption only says <em>still showed up</em>.</p>
<<else>>
<<actor bestfriend>>Show the wristband. That is your tiny certificate of negotiation. $girlfriendName is going to find this adorable.<</actor>>
<p class="delayed">She frames the violet band beside the key-shaped charm on her phone case, then sends it to $girlfriendName.</p>
<</if>>
<p class="delayed">She takes you past the main floor to a booth behind a violet curtain. Your errands last ten minutes: water, her charger, the bill. Then she props her phone against the ice bucket. $girlfriendName answers from her bedroom, the key visible at her throat.</p>
<img class="hero-img centered delayed" @src="setup.ImagePath+'story/owned/ch6/borrowed-friday-vip-tease.jpg'" alt="Alessia facing the MC in the private booth during Jenny's video call">
<<actor girlfriend>>
I can see both of you. No unlocking, no hands inside his clothes, and he can stop whenever he wants.
$youName, tell her what you want.
<</actor>>
<<actor bestfriend>>
Look at that, your keyholder gave you a whole sentence to hide behind.
I want to sit on your lap and find out whether you stay still when I move. Do I have permission?
<</actor>>
<p class="delayed">She waits. No smirk, no hand on you yet. $girlfriendName stays silent on the screen.</p>
<span id="conv"></span>
<div id="options">
<<you-choice "Yes. Sit down and show her.">>
<p class="delayed">$bestfriendName turns and settles across your lap. The first roll of her hips presses the cage into your thigh. The second makes it click. She moves slowly enough that every failed twitch reaches the phone camera.</p>
<<actor bestfriend>>Locked, hard, and useless. $girlfriendName really does know what fits you.<</actor>>
<<actor girlfriend>>Keep looking at me, baby. She stops when you say stop.<</actor>>
[[Follow her to the dance floor|Borrowed Friday dance floor][$flags.alessiaFridayVipDone = true; $flags.alessiaFridayClubStance = "invite"; _heat = setup.nudgeArousal(18)]]
<</you-choice>>
<<you-choice "Thirty seconds. Clothes stay on, and the call stays private.">>
<p class="delayed">She sets a timer on $girlfriendName's screen, then sits sideways across you. Thirty seconds is long enough for her thigh to find the cage and for your breathing to betray you. She stands when the timer ends.</p>
<<actor bestfriend>>You made it to thirty, barely. You still leaked through your underwear before fifteen seconds.<</actor>>
<<actor girlfriend>>The call stays private, baby.<</actor>>
[[Follow her to the dance floor|Borrowed Friday dance floor][$flags.alessiaFridayVipDone = true; $flags.alessiaFridayClubStance = "timed"; _heat = setup.nudgeArousal(14)]]
<</you-choice>>
<<you-choice "No touching. You can tease me without sitting on me.">>
<p class="delayed">$bestfriendName's smile tightens for half a second. Then she leans back and puts both bare feet across your lap instead. One heel rests beside the cage without touching it. She spends the rest of the call describing exactly what she would have done.</p>
<<actor bestfriend>>Still squirming, and I did not even touch it. I almost feel bad charging you for tonight.<</actor>>
<<actor girlfriend>>The feet might be meaner anyway.<</actor>>
[[Follow her to the dance floor|Borrowed Friday dance floor][$flags.alessiaFridayVipDone = true; $flags.alessiaFridayClubStance = "boundary"; _heat = setup.nudgeArousal(8)]]
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !$flags.alessiaFridayVipDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch6/borrowed-friday-dance-floor.jpg'" alt="Alessia waiting beside the nightclub dance floor">
<p class="scene-lead">The private-booth call has not happened yet.</p>
<div class="continue-links">[[Return to the booth|Borrowed Friday club]]</div>
</div>
<<elseif $flags.alessiaFridayDanceDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch6/borrowed-friday-dance-floor.jpg'" alt="Alessia dancing with an adult club guest while the MC holds her things">
<p class="scene-lead">The song is over. $bestfriendName is waiting near the private restroom.</p>
<div class="continue-links">[[Follow her|Borrowed Friday bathroom]]</div>
</div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch6/borrowed-friday-dance-floor.jpg'" alt="Alessia kissing an adult club guest while the MC holds her shoes and bag">
<h2 class="scene-title">Her dance, your view</h2>
<p class="scene-lead">The call ends. $bestfriendName puts her shoes in one of your hands and her bag in the other, then walks onto the crowded floor in her bare feet.</p>
<p class="delayed">She chooses a handsome man near the bar. One song becomes two. When he bends toward her, she catches his shirt and kisses him. Her eyes open halfway through and find you exactly where she left you.</p>
<<actor bestfriend>>Hold the shoes higher. I want to know you stayed for the part $girlfriendName did not get on camera.<</actor>>
<<actor-thought you>>
The cage is still hot from the booth. Her heels knock together in your hand while his palm settles at her waist.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "I keep watching when she looks back.">>
<p class="delayed">You meet her eyes and do not pretend the kiss is happening somewhere else. She smiles against his mouth before turning fully toward him.</p>
<<actor bestfriend>>At least the driver can follow one simple instruction.<</actor>>
[[Follow her toward the restroom|Borrowed Friday bathroom][$flags.alessiaFridayDanceDone = true; $flags.alessiaFridayDanceStance = "watch"]]
<</you-choice>>
<<you-choice "I look away after the kiss starts.">>
<p class="delayed">You focus on the lights above the bar. The song keeps moving under your feet, and her shoes remain heavy in your hand.</p>
<<actor bestfriend>>Cute. You looked away and still waited with my bag until I was finished.<</actor>>
[[Follow her toward the restroom|Borrowed Friday bathroom][$flags.alessiaFridayDanceDone = true; $flags.alessiaFridayDanceStance = "look-away"]]
<</you-choice>>
<<you-choice "No pictures of this. It stays private.">>
<p class="delayed">She hears you when the song breaks. Her phone stays face down on the table. The man gets another kiss, but no camera turns toward you.</p>
<<actor bestfriend>>Clear enough. I will tell $girlfriendName about it instead, in detail.<</actor>>
[[Follow her toward the restroom|Borrowed Friday bathroom][$flags.alessiaFridayDanceDone = true; $flags.alessiaFridayDanceStance = "private"]]
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !$flags.alessiaFridayDanceDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch6/borrowed-friday-bathroom.jpg'" alt="Alessia waiting in the violet-lit restroom">
<p class="scene-lead">$bestfriendName has not finished on the dance floor yet.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<elseif $flags.alessiaBorrowedFridayDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch6/borrowed-friday-bathroom.jpg'" alt="Alessia holding the black lace from her club outfit">
<p class="scene-lead">The club night is over. $girlfriendName is waiting for the report.</p>
<div class="continue-links">[[Face the debrief|Borrowed Friday debrief]]</div>
</div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch6/borrowed-friday-bathroom.jpg'" alt="Alessia offering her black lace panties in the club restroom">
<h2 class="scene-title">What she leaves with you</h2>
<p class="scene-lead">After the dance, $bestfriendName takes back her bag but leaves her shoes in your hand. She leads you into the private restroom and locks the door.</p>
<p class="delayed">Behind the locked door, she reaches under her dress. Black lace slides down one leg. She steps out of it and holds it toward you, still warm and damp from dancing.</p>
<<actor bestfriend>>
$girlfriendName wants the full story. This is part of it.
Pocket, permission, or no. Pick one without making me listen to a committee meeting.
<</actor>>
<span id="conv"></span>
<div id="options">
<<you-choice "I'll put them in my pocket. My keyholder can decide what happens at home.">>
<p class="delayed">She folds the lace once and pushes it into your front pocket. Her knuckles brush the hard outline of the cage through the fabric, just long enough to make you jerk.</p>
<<actor bestfriend>>That reaction goes in the report too.<</actor>>
[[Drive back to the apartment|Borrowed Friday drive home][_fr = setup.completeBorrowedFriday(); $flags.alessiaBorrowedFridayDone = _fr.completed; $flags.alessiaFridayPanties = "carry"]]
<</you-choice>>
<<you-choice "Call my keyholder first. I want her answer, not an assumption.">>
<<actor girlfriend>>Put them in your jacket pocket and bring them home. Thanks for asking before deciding for me.<</actor>>
<p class="delayed">$bestfriendName drops the lace into your pocket without touching the cage this time.</p>
<<actor bestfriend>>You actually called her first. God, that is embarrassing.<</actor>>
[[Drive back to the apartment|Borrowed Friday drive home][_fr = setup.completeBorrowedFriday(); $flags.alessiaBorrowedFridayDone = _fr.completed; $flags.alessiaFridayPanties = "ask"]]
<</you-choice>>
<<you-choice "No. Put them in your bag. I am not carrying them.">>
<p class="delayed">She studies your face, then drops the lace into her bag.</p>
<<actor bestfriend>>Fine, but you still held my shoes while I kissed him, so do not look too proud.<</actor>>
[[Drive back to the apartment|Borrowed Friday drive home][_fr = setup.completeBorrowedFriday(); $flags.alessiaBorrowedFridayDone = _fr.completed; $flags.alessiaFridayPanties = "refuse"]]
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !$flags.alessiaBorrowedFridayDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch6/borrowed-friday-drive-'+($flags.alessiaFridayDresscode || 'limit')+'.jpg'" alt="The MC driving Alessia home after the club">
<p class="scene-lead">The club night is not finished yet.</p>
<div class="continue-links">[[Return to the club|Borrowed Friday bathroom]]</div>
</div>
<<elseif $flags.alessiaFridayDriveDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch6/borrowed-friday-drive-'+($flags.alessiaFridayDresscode || 'limit')+'.jpg'" alt="The MC driving Alessia home after the club">
<p class="scene-lead">The drive is over. $girlfriendName is waiting upstairs.</p>
<div class="continue-links">[[Face the debrief|Borrowed Friday debrief]]</div>
</div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch6/borrowed-friday-drive-'+($flags.alessiaFridayDresscode || 'limit')+'.jpg'" alt="The MC driving Alessia home in the club outfit chosen at the boutique">
<h2 class="scene-title">Passenger seat</h2>
<p class="scene-lead">The club disappears in the mirror. $bestfriendName reclines beside you with bare feet on the dashboard, her shoes on the floor and her bag safely behind your seat.</p>
<<if $flags.alessiaFridayDresscode eq "obey">>
<p class="delayed">The violet shirt pulls across your shoulders every time you turn the wheel.</p>
<<elseif $flags.alessiaFridayDresscode eq "compromise">>
<p class="delayed">The violet wristband flashes whenever your hand crosses the dashboard lights.</p>
<<else>>
<p class="delayed">Your own black shirt survived her dress code. Everything else about the night still sits beside you.</p>
<</if>>
<<actor bestfriend>>
<<if $flags.alessiaFridayDanceStance eq "watch">>You watched the whole kiss. Now try watching the road with the same commitment.<<elseif $flags.alessiaFridayDanceStance eq "look-away">>You looked away from the kiss and still waited with my things until I was done. Very brave.<<else>>No dance-floor pictures, exactly like you asked. You still waited there holding everything.<</if>>
<</actor>>
<<if $flags.alessiaFridayPanties eq "carry" || $flags.alessiaFridayPanties eq "ask">>
<p class="delayed">The folded lace rests in your pocket through every turn. You keep both hands visible on the wheel.</p>
<<else>>
<p class="delayed">Her lace stays zipped inside the bag behind you. She does not ask you to carry it again.</p>
<</if>>
<p class="delayed">At the next red light, your fingers tighten around the wheel. $bestfriendName watches them for a moment instead of your face.</p>
<<actor bestfriend>>
Loosen your hands. You did that with your pen before the presentation too.
Do not read into it. I just want to get home in one piece.
<</actor>>
<<actor girlfriend>>
(text) <<if $girlfriendTrustLevel gte 8>>You did well tonight, baby. Bring her home and come upstairs to me. 😘<<elseif $girlfriendTrustLevel lte 3>>Drive carefully. I want the receipts and a complete report when you arrive.<<else>>I have the booth report. Bring her home, then we talk. 💜<</if>>
<</actor>>
<div class="continue-links">
[[Take her upstairs.|Borrowed Friday debrief][$flags.alessiaFridayDriveDone = true]]
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !$flags.alessiaFridayDriveDone && !$flags.alessiaFridayDebriefDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch6/borrowed-friday-debrief.jpg'" alt="Jenny and Alessia reviewing the Friday report">
<p class="scene-lead">$girlfriendName is still waiting for $bestfriendName's completed report.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch6/borrowed-friday-debrief.jpg'" alt="Jenny and Alessia reviewing the Friday receipts together">
<h2 class="scene-title">The report</h2>
<p class="scene-lead">$girlfriendName sits at the kitchen counter with the key against her chest. $bestfriendName stands behind her while your receipts and the permitted photos move across the phone screen.</p>
<p class="hint-line">Friday paid: <strong>$<<= $flags.fridayLastPaid || setup.borrowedFridayCost()>></strong> · wallet <strong>$money</strong></p>
<<actor girlfriend>>
You got her there, covered the night, and brought her home. I stayed on the booth call until it ended.
<<if $flags.alessiaFridayClubStance eq "invite">>You told her yes and kept checking my face while she moved on you. I liked that part.<</if>>
<<if $flags.alessiaFridayClubStance eq "timed">>Thirty seconds, clothes on, private call. She stopped on time.<</if>>
<<if $flags.alessiaFridayClubStance eq "boundary">>You said no touching. She listened, and you still looked ready to burst with her feet on your lap.<</if>>
<<if $flags.alessiaFridayDanceStance eq "watch">>Then you watched her kiss him without looking away when she checked on you.<</if>>
<<if $flags.alessiaFridayDanceStance eq "look-away">>You looked away from the kiss. She left the choice alone and kept you holding her things.<</if>>
<<if $flags.alessiaFridayDanceStance eq "private">>You said no pictures on the dance floor. She kept the phone down and gave me an honest report instead.<</if>>
<</actor>>
<<actor bestfriend>>
He was useful, and the cage made all of it funnier.
<<if $flags.alessiaFridayDresscode eq "obey">>The violet shirt did more for him than confidence ever has.<</if>>
<<if $flags.alessiaFridayDresscode eq "compromise">>He negotiated for a wristband like a tiny union representative.<</if>>
<<if $flags.alessiaFridayDresscode eq "limit">>He said no to the shirt without apologizing. I hated the personal growth.<</if>>
<</actor>>
<<if $flags.alessiaFridayPanties eq "carry" || $flags.alessiaFridayPanties eq "ask">>
<p class="delayed">$girlfriendName holds out her hand. You pull the folded black lace from your pocket and place it on her palm. She presses it against the cage through your trousers while $bestfriendName watches.</p>
<<actor girlfriend>>Still warm. You carried that against yourself all the way home and stayed locked. Good boy.<</actor>>
<<elseif $flags.alessiaFridayPanties eq "refuse">>
<p class="delayed">$bestfriendName places the black lace on the counter herself. $girlfriendName glances at it, then back at you.</p>
<<actor girlfriend>>You refused to carry them, and she put them away. That was the agreement. I still saw you holding her shoes while she kissed him.<</actor>>
<</if>>
<<actor-thought you>>
<<if $flags.alessiaFridayClubStance eq "boundary">>You remember her bare feet across your lap and how carefully she kept the promised space above the cage.<<else>>You remember her weight across your lap and $girlfriendName watching from the phone.<</if>> The black lace on the counter makes the whole drive home feel visible again.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "I wanted you to see what she could do to me while you kept the key.">>
<<actor girlfriend>>I saw. You wanted my permission even with her body on you. That is why the key stayed here.<</actor>>
<<set $flags.alessiaFridayDebriefStance = "keyholder">>
<<set $girlfriendTrustLevel = setup.changeFavor(1)>>
<<include "Borrowed Friday closing">>
<</you-choice>>
<<you-choice "Watching her kiss him while I held her things made the cage worse.">>
<<actor bestfriend>>Finally. He admits the part I did not even have to set up.<</actor>>
<<actor girlfriend>>Then we know what worked. You watched, came home to me, and stayed locked for all of it.<</actor>>
<<set $flags.alessiaFridayDebriefStance = "watching">>
<<set $girlfriendTrustLevel = setup.changeFavor(1)>>
<<include "Borrowed Friday closing">>
<</you-choice>>
<<you-choice "The choices I made stay mine next time.">>
<<actor girlfriend>>Yes. The shirt, the touching, and what you carry are still separate choices. Nothing becomes automatic, baby.<</actor>>
<<actor bestfriend>>Annoyingly clear. I can work with clear.<</actor>>
<<set $flags.alessiaFridayDebriefStance = "limit">>
<<include "Borrowed Friday closing">>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<div class="borrowed-friday-closing">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch6/alessia-instructions.jpg'" alt="A final message from Alessia about the next Friday">
<<actor bestfriend>>
(text) One request for next time: I want the key for the drive home. One hour. I want to see whether he can sit beside me without checking your neck every ten seconds. 💅
<</actor>>
<<actor girlfriend>>
(text) Request received. No answer tonight.
$youName, put the phone down before you spend all night overthinking it. 😘
<</actor>>
<div class="continue-links">
[[Save the message.|Home][$flags.alessiaFridayDebriefDone = true; $storyBeat = "borrowed-friday-complete"; $gameDate = setup.changeDate($gameDate, "hours", 1)]]
</div>
<<run setTimeout(function () { setup.renderDelayedElements(document.getElementById("conv")); }, 0)>>
</div>
<</nobr>><<nobr>>
<<if !$flags.alessiaFridayDebriefDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-hour-terms.png'" alt="Jenny considering Alessia's request with the cage key in her hand">
<p class="scene-lead">$girlfriendName has not heard $bestfriendName's full Friday report yet.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<elseif $flags.alessiaKeyTermsDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-hour-terms.png'" alt="Jenny holding the key after setting the rules">
<p class="scene-lead">Your answer is recorded. The drive waits for a later Friday.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-hour-terms.png'" alt="Jenny considering Alessia's request with the cage key in her hand">
<h2 class="scene-title">The answer</h2>
<p class="scene-lead">Saturday morning, $girlfriendName sits beside you with the key in her palm. $bestfriendName waits on video while she gives the request a real answer.</p>
<<actor girlfriend>>
She asked for one hour on the next drive home. If you agree, the cage stays locked. She does not copy the key, photograph it, or pass it to anyone. You can end the loan early.
<<if $flags.alessiaFridayDebriefStance eq "limit">>Everything you refused last Friday stays refused unless you explicitly change it now.<</if>>
<</actor>>
<<actor bestfriend>>
(text) I asked to hold a key, not adopt him. One hour, one drive, then it goes straight back to you. He can keep both hands on the wheel and all twelve paragraphs of his panic to himself. 💅
<</actor>>
<<actor-thought you>>
$girlfriendName has never let $bestfriendName hold the key. Agreeing would change that for one hour. Refusing would leave it exactly where it is now.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "One hour. She can hold it, but the cage stays locked.">>
<<actor girlfriend>>Then I hand it to her myself, start the timer, and take it back myself. One more question. Can she tease you over your trousers, or is this words only?<</actor>>
<div class="continue-links">
<<link "She can tease me over my trousers.">><<run setup.setAlessiaKeyTerms("accepted", "touch")>><<goto "Home">><</link>>
<<link "Words only. No touching.">><<run setup.setAlessiaKeyTerms("accepted", "verbal")>><<goto "Home">><</link>>
</div>
<</you-choice>>
<<you-choice "She can hold it only inside a sealed pouch.">>
<<actor bestfriend>>A tamper seal for a key I already promised not to use is fine. Watching you check it at every light might be worth the stationery.<</actor>>
<<actor girlfriend>>The pouch stays sealed. Do you allow teasing over your trousers, or words only?<</actor>>
<div class="continue-links">
<<link "The sealed pouch and teasing over my trousers.">><<run setup.setAlessiaKeyTerms("sealed", "touch")>><<goto "Home">><</link>>
<<link "The sealed pouch, but words only.">><<run setup.setAlessiaKeyTerms("sealed", "verbal")>><<goto "Home">><</link>>
</div>
<</you-choice>>
<<you-choice "No. You keep the key.">>
<<actor girlfriend>>Okay. I keep it. You still drive her home next Friday, and nobody pretends your answer meant something else.<</actor>>
<<actor bestfriend>>He found the shortest sentence of his life. I will survive the ride without his key.<</actor>>
<div class="continue-links"><<link "Keep it with her.">><<run setup.setAlessiaKeyTerms("declined", "verbal")>><<goto "Home">><</link>></div>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !$flags.alessiaKeyTermsDone || !setup.alessiaKeyWeekReady(5)>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-week-park.png'" alt="Jenny waiting with the key on a park bench">
<p class="scene-lead">The walk waits until after the private answer at home.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<elseif $flags.alessiaKeyParkDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-week-park.png'" alt="Jenny wearing the cage key in the park">
<p class="scene-lead">The private walk is over. $girlfriendName still has the key.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-week-park.png'" alt="Jenny wearing the cage key during a quiet Sunday park walk">
<h2 class="scene-title">A day with her</h2>
<p class="scene-lead">Before the school-week conversations begin, you walk from home to the park with $girlfriendName. She keeps her coat open and the key visible at her collarbone. $bestfriendName is nowhere near the benches.</p>
<<actor girlfriend>>
I wanted one day where this was between us. She heard the terms on the call, but she does not get this walk too.
<<if $flags.alessiaKeyConsent eq "declined">>You said no. The key stays here Friday, exactly like it stays here now.<</if>>
<<if $flags.alessiaKeyConsent eq "sealed">>The sealed pouch is a real limit. I will prepare it Thursday, and I keep the key until the handoff.<</if>>
<<if $flags.alessiaKeyConsent eq "accepted">>You agreed to one hour. That does not give her the rest of the week.<</if>>
<</actor>>
<p class="delayed">She takes your hand and guides it into her coat pocket. Joggers pass on the path while her other hand closes around the key against her chest.</p>
<<actor-thought you>>
Last Friday made $bestfriendName part of the drive home. This walk still belongs to you and $girlfriendName, and the key remains warm beneath her fingers.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<if $flags.alessiaKeyConsent neq "declined">>
<<you-choice "I agreed because you are still the one setting the limit.">>
<<actor girlfriend>>I am. Friday changes who holds it for an hour, not who decides whether that hour happens.<</actor>>
[[Walk home together|Home][$flags.alessiaKeyParkDone = true; $flags.alessiaKeyParkStance = "trust"; $gameDate = setup.changeDate($gameDate, "hours", 1)]]
<</you-choice>>
<<you-choice "I agreed only to the exact terms. Nothing extra.">>
<<actor girlfriend>>Then keep saying that clearly. I will make her repeat the return time before anything changes hands.<</actor>>
[[Walk home together|Home][$flags.alessiaKeyParkDone = true; $flags.alessiaKeyParkStance = "exact"; $gameDate = setup.changeDate($gameDate, "hours", 1)]]
<</you-choice>>
<<else>>
<<you-choice "I still wanted this walk after saying no to her.">>
<<actor girlfriend>>I'm glad. Refusing her did not refuse me. Come closer and stop staring at my necklace.<</actor>>
[[Walk home together|Home][$flags.alessiaKeyParkDone = true; $flags.alessiaKeyParkStance = "couple"; $gameDate = setup.changeDate($gameDate, "hours", 1)]]
<</you-choice>>
<<you-choice "I need her to hear the same answer tomorrow.">>
<<actor girlfriend>>She will. I will be standing beside you when she hears it.<</actor>>
[[Walk home together|Home][$flags.alessiaKeyParkDone = true; $flags.alessiaKeyParkStance = "repeat-boundary"; $gameDate = setup.changeDate($gameDate, "hours", 1)]]
<</you-choice>>
<</if>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !$flags.alessiaKeyParkDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-week-school.png'" alt="Jenny and Alessia in the school hallway">
<p class="scene-lead">The hallway conversation waits until after the park walk.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<elseif $flags.alessiaKeySchoolDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-week-school.png'" alt="Jenny wearing the key beside Alessia at school">
<p class="scene-lead">$bestfriendName already heard the answer. $girlfriendName left the hallway with the key.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-week-school.png'" alt="Jenny wearing the cage key while Alessia confronts the MC at school">
<h2 class="scene-title">The answer reaches school</h2>
<p class="scene-lead">At the next school morning, $bestfriendName is leaning against your locker. $girlfriendName stands beside you with the key exposed above her blouse.</p>
<<actor bestfriend>>
<<if $flags.alessiaKeyConsent eq "accepted">>You really agreed to let me hold it for one full hour, with fewer negotiations and spreadsheets than I expected.<</if>>
<<if $flags.alessiaKeyConsent eq "sealed">>A sealed pouch for one hour. You found a way to make Friday sound like registered mail.<</if>>
<<if $flags.alessiaKeyConsent eq "declined">>No handoff. Clear answer. You are still driving me, so do not look too proud yet.<</if>>
<</actor>>
<<actor girlfriend>>
You heard his answer. Do not turn the hallway version into something he did not agree to.
<</actor>>
<span id="conv"></span>
<div id="options">
<<you-choice "Repeat only the answer I gave.">>
<<actor bestfriend>><<if $flags.alessiaKeyConsent eq "declined">>No handoff and one drive. That is all I say.<</if>><<if $flags.alessiaKeyConsent neq "declined">>One hour and the rules you approved. Nothing added.<</if>><</actor>>
[[Go to class|After school][$flags.alessiaKeySchoolDone = true; $flags.alessiaKeySchoolStance = "permitted-only"; $schoolDay += 1; _hour = setup.setGameHour(14, 0)]]
<</you-choice>>
<<you-choice "Keep the arrangement between the three of us.">>
<<actor girlfriend>>Then nobody at school gets the details.<</actor>>
<<actor bestfriend>>The hallway gets nothing, then.<</actor>>
[[Go to class|After school][$flags.alessiaKeySchoolDone = true; $flags.alessiaKeySchoolStance = "private"; $schoolDay += 1; _hour = setup.setGameHour(14, 0)]]
<</you-choice>>
<<you-choice "You can say we have a Friday plan. No details.">>
<<actor bestfriend>>A Friday drive and an agreement. Accurate, vague, and still enough to watch you react.<</actor>>
[[Go to class|After school][$flags.alessiaKeySchoolDone = true; $flags.alessiaKeySchoolStance = "record"; $schoolDay += 1; _hour = setup.setGameHour(14, 0)]]
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !$flags.alessiaKeySchoolDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-week-cafe.png'" alt="Jenny and Alessia waiting at a café table">
<p class="scene-lead">The café meeting waits until $bestfriendName has heard the answer at school.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<elseif $flags.alessiaKeyCafeDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-week-cafe.png'" alt="Jenny and Alessia at the café near school">
<p class="scene-lead">The route and check-in rule are already settled.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-week-cafe.png'" alt="Jenny, Alessia, and the MC discussing Friday at the café near school">
<h2 class="scene-title">Five minutes from campus</h2>
<p class="scene-lead">After the final bell, the three of you walk past the bus stop and into a narrow café five minutes from school. $girlfriendName takes the seat beside you. $bestfriendName sits opposite with the route open on her phone.</p>
<<actor bestfriend>>Pickup at the apartment. Riverside road, then the long loop back. No club, no mystery stop, and no extra passenger.<</actor>>
<<actor girlfriend>>
<<if $flags.alessiaKeyConsent eq "declined">>And no key transfer. I keep it for the entire route.<</if>>
<<if $flags.alessiaKeyConsent eq "sealed">>The sealed pouch returns to my hand before anyone goes upstairs.<</if>>
<<if $flags.alessiaKeyConsent eq "accepted">>The key returns to my hand before anyone goes upstairs.<</if>>
Choose how we communicate during the drive.
<</actor>>
<<actor-thought you>>
The walk and the three coffees could pass for an ordinary afternoon. The route glowing between their hands cannot.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "Send a midpoint check-in.">>
<<actor girlfriend>>Halfway through, I get the timer and your location. If the loan ended early, the message says that plainly.<</actor>>
[[Walk home from the café|Home][$flags.alessiaKeyCafeDone = true; $flags.alessiaKeyContactRule = "midpoint"; $schoolDay += 1; _hour = setup.setGameHour(17, 0)]]
<</you-choice>>
<<you-choice "Only contact her at the return point.">>
<<actor bestfriend>>One uninterrupted drive, then a return message. He might make it six blocks before asking what time it is.<</actor>>
[[Walk home from the café|Home][$flags.alessiaKeyCafeDone = true; $flags.alessiaKeyContactRule = "return-only"; $schoolDay += 1; _hour = setup.setGameHour(17, 0)]]
<</you-choice>>
<<you-choice "No fake messages about using the key.">>
<<actor bestfriend>>No fake unlock, no cropped photo, no bait. I can still describe his face accurately.<</actor>>
<<actor girlfriend>>Good, only real updates.<</actor>>
[[Walk home from the café|Home][$flags.alessiaKeyCafeDone = true; $flags.alessiaKeyContactRule = "no-bait"; $schoolDay += 1; _hour = setup.setGameHour(17, 0)]]
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !$flags.alessiaKeyCafeDone || !setup.alessiaKeyWeekReady(1)>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-week-prep.png'" alt="Jenny preparing the key at home">
<p class="scene-lead">The private preparation waits until after the café meeting.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<elseif $flags.alessiaKeyPrepDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-week-prep.png'" alt="Jenny keeping the prepared key overnight">
<p class="scene-lead">Everything is ready for Friday. The key remains with $girlfriendName overnight.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-week-prep.png'" alt="Jenny preparing the cage key and Friday clothes at home">
<h2 class="scene-title">Still hers before the drive</h2>
<p class="scene-lead">Before the scheduled Friday, $girlfriendName lays your clothes across the bed. The key stays in her hand while she checks the cage and the lock.</p>
<<if $flags.alessiaKeyConsent eq "sealed">>
<p class="delayed">She places the key inside a clear numbered pouch, presses the seal closed, then locks the pouch in her bedside drawer.</p>
<<actor girlfriend>>Sealed, but still mine until tomorrow night. $bestfriendName does not touch the pouch before the handoff.<</actor>>
<<elseif $flags.alessiaKeyConsent eq "accepted">>
<p class="delayed">She clips a short violet wrist loop through the key ring, tests the clasp, and returns it to her necklace.</p>
<<actor girlfriend>>The loop makes the return obvious. It stays on my neck until tomorrow night.<</actor>>
<<else>>
<p class="delayed">She polishes the key with her thumb and clips it back around her own neck.</p>
<<actor girlfriend>>No pouch and no handoff. Tomorrow it stays exactly here.<</actor>>
<</if>>
<p class="delayed">You set a plain black shirt beside the rest of your clothes. It does not repeat last Friday's signal or give the drive a costume.</p>
<<actor girlfriend>>Good, the agreement can stand without dressing it up.<</actor>>
<div class="continue-links">
[[Finish preparing|Home][$flags.alessiaKeyPrepDone = true; $flags.alessiaKeyPickupStyle = "plain"; _hour = setup.advanceGameHourTo(20, 0)]]
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !$flags.alessiaKeyPrepDone || !setup.alessiaKeyFridayDue()>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-week-pickup.png'" alt="Jenny and Alessia waiting beside the car">
<p class="scene-lead">The Friday pickup is not ready. The key remains with $girlfriendName.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<elseif $flags.alessiaKeyPickupDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-week-pickup.png'" alt="Jenny retaining the key before the evening handoff">
<p class="scene-lead">The pickup is complete. $girlfriendName keeps the key until the agreed time.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-week-pickup.png'" alt="Jenny, Alessia, and the MC meeting beside the car before the handoff">
<h2 class="scene-title">Before dark</h2>
<p class="scene-lead">Friday afternoon, $bestfriendName waits by the passenger door. $girlfriendName stands beside you with <<if $flags.alessiaKeyConsent eq "sealed">>the sealed pouch in her own hand<<else>>the key still at her neck<</if>>.</p>
<<actor bestfriend>>
<<if $flags.alessiaKeyContactRule eq "midpoint">>Midpoint text is set.<</if>><<if $flags.alessiaKeyContactRule eq "return-only">>No messages until the return point.<</if>><<if $flags.alessiaKeyContactRule eq "no-bait">>Only real updates. A tragic loss for comedy.<</if>>
<</actor>>
<<actor girlfriend>>Nothing changes hands before seven tonight. Say what you need to say now.<</actor>>
<span id="conv"></span>
<div id="options">
<<if $flags.alessiaKeyConsent neq "declined">>
<<you-choice "The terms have not changed.">>
<<actor girlfriend>>Good, we meet again after dark, and I make the handoff myself.<</actor>>
[[Wait at home until evening|Home][$flags.alessiaKeyPickupDone = true; $flags.alessiaKeyPickupStance = "clear"; _hour = setup.advanceGameHourTo(18, 0)]]
<</you-choice>>
<<you-choice "I can still end the loan before the handoff.">>
<<actor girlfriend>>Yes. Agreement is not a trap. If you stop it, the key never leaves me.<</actor>>
<<actor bestfriend>>Fine, if you stop it, I drop it.<</actor>>
[[Wait at home until evening|Home][$flags.alessiaKeyPickupDone = true; $flags.alessiaKeyPickupStance = "limit"; _hour = setup.advanceGameHourTo(18, 0)]]
<</you-choice>>
<<else>>
<<you-choice "I said no to the key. I am still giving you the ride.">>
<<actor bestfriend>>That is correct. Driver, no key. I heard it the first time.<</actor>>
[[Wait at home until evening|Home][$flags.alessiaKeyPickupDone = true; $flags.alessiaKeyPickupStance = "clear"; _hour = setup.advanceGameHourTo(18, 0)]]
<</you-choice>>
<<you-choice "Do not joke later that you held it.">>
<<actor bestfriend>>I will mock the drive I actually got. Your key stays with her.<</actor>>
[[Wait at home until evening|Home][$flags.alessiaKeyPickupDone = true; $flags.alessiaKeyPickupStance = "boundary"; _hour = setup.advanceGameHourTo(18, 0)]]
<</you-choice>>
<</if>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !$flags.alessiaKeyTermsDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-hour-handoff-kept.png'" alt="Jenny keeping the cage key in her hand">
<p class="scene-lead">No answer has been recorded, so the key stays with $girlfriendName.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<elseif !$flags.alessiaKeyPickupDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-hour-handoff-kept.png'" alt="Jenny keeping the cage key before the scheduled pickup">
<p class="scene-lead">The Friday pickup and final check have not happened. The key stays with $girlfriendName.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<elseif !setup.alessiaKeyFridayDue() || $gameDate.getHours() lt 19>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-hour-handoff-kept.png'" alt="Jenny waiting with the cage key">
<p class="scene-lead">The pickup is scheduled for a later Friday after dark.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<elseif $flags.alessiaKeyHandoffDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath + 'story/owned/ch7/key-hour-handoff-' + ($flags.alessiaKeyConsent === 'declined' ? 'kept' : 'transfer') + '.png'" alt="The agreed key handoff before the drive">
<p class="scene-lead">The terms are set and the car is waiting.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<else>>
<<run setup.handoffAlessiaKey()>>
<div class="scene-panel compact">
<<if $flags.alessiaKeyConsent eq "declined">>
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-hour-handoff-kept.png'" alt="Jenny keeping the cage key while Alessia waits by the car">
<h2 class="scene-title">The key stays</h2>
<p class="scene-lead">Friday night, $girlfriendName meets you beside the car. $bestfriendName is waiting at the passenger door. The key remains on the chain around $girlfriendName's neck.</p>
<<actor girlfriend>>You said no, so there is no handoff. Drive safely and bring her home.<</actor>>
<<actor bestfriend>>I can still count how often you look at $girlfriendName's neck before we leave.<</actor>>
<<else>>
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-hour-handoff-transfer.png'" alt="Jenny deliberately passing the cage key to Alessia">
<h2 class="scene-title">The handoff</h2>
<p class="scene-lead">Friday night, $girlfriendName meets you beside the car. $bestfriendName holds out her hand while $girlfriendName <<if $flags.alessiaKeyConsent eq "sealed">>checks the seal on a clear pouch<<else>>unclips the key from her chain<</if>>.</p>
<<actor girlfriend>>The cage stays locked. The hour starts when this touches your hand. If he ends it early, you give it back immediately.<</actor>>
<<actor bestfriend>><<if $flags.alessiaKeyConsent eq "sealed">>Seal intact, return time eight o'clock. I can read.<</if>><<if $flags.alessiaKeyConsent eq "accepted">>Eight o'clock. Then it goes back into your hand.<</if>><</actor>>
<p class="delayed">$girlfriendName places <<if $flags.alessiaKeyConsent eq "sealed">>the pouch<<else>>the small brass key<</if>> in $bestfriendName's palm. Only then does she step away from the passenger door.</p>
<</if>>
<<actor-thought you>>
<<if $flags.alessiaKeyConsent eq "declined">>Nothing changed hands. The answer remains visible on $girlfriendName's chain.<</if>>
<<if $flags.alessiaKeyConsent neq "declined">>The cage stays closed, but the person holding its key is about to sit beside you.<</if>>
<</actor-thought>>
<div class="continue-links">
[[Start the drive.|Home][$storyBeat = "alessia-key-handoff"]]
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !$flags.alessiaKeyHandoffDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-hour-drive-kept.png'" alt="Alessia waiting in the passenger seat">
<p class="scene-lead">The drive has not started.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<elseif $flags.alessiaKeyDriveDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath + 'story/owned/ch7/key-hour-drive-' + ($flags.alessiaKeyConsent === 'declined' ? 'kept' : 'transfer') + '.png'" alt="The night drive with Alessia">
<p class="scene-lead">The car is already approaching the agreed return point.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath + 'story/owned/ch7/key-hour-drive-' + ($flags.alessiaKeyConsent === 'declined' ? 'kept' : 'transfer') + '.png'" alt="Alessia in the passenger seat during the night drive">
<h2 class="scene-title">Passenger seat</h2>
<p class="scene-lead">The city thins into long red lights. $bestfriendName sits beside you, one heel tucked under the seat. <<if $flags.alessiaKeyConsent eq "declined">>$girlfriendName's key never entered the car.<</if>><<if $flags.alessiaKeyConsent eq "accepted">>The key rests against $bestfriendName's wrist.<</if>><<if $flags.alessiaKeyConsent eq "sealed">>The clear pouch lies sealed on her open palm.<</if>></p>
<<actor bestfriend>>
<<if $flags.alessiaKeySchoolStance eq "private">>The Friday arrangement stayed between us, exactly as you asked.<</if>><<if $flags.alessiaKeySchoolStance eq "permitted-only">>At school, I repeated only <<if $flags.alessiaKeyConsent eq "declined">>your no and the drive<<else>>the hour and the rules you approved<</if>>. Nothing else.<</if>><<if $flags.alessiaKeySchoolStance eq "record">>I said we had a Friday plan and left out the details.<</if>>
<</actor>>
<<if $flags.alessiaKeyTouchConsent eq "touch" && $flags.alessiaKeyConsent neq "declined">>
<p class="delayed">At a red light, she lays two fingers over the cage through your trousers. She watches the signal, not your face, and removes them before it changes.</p>
<<actor bestfriend>>That was over the fabric, exactly as agreed. Keep driving.<</actor>>
<<else>>
<p class="delayed">She does not touch you. Her voice and the passenger seat are enough.</p>
<</if>>
<<if $flags.alessiaKeyContactRule eq "midpoint">>
<<actor girlfriend>>(text) Midpoint received. Tell me whether the key moved and whether the hour is still open.<</actor>>
<<actor bestfriend>>(text) Still on route. <<if $flags.alessiaKeyConsent eq "declined">>Your key never left your neck.<<elseif $flags.alessiaKeyConsent eq "sealed">>Seal intact.<<else>>Key visible, cage locked.<</if>><</actor>>
<<elseif $flags.alessiaKeyContactRule eq "return-only">>
<p class="delayed">The phone stays dark. The next message waits for the return point, exactly as you chose.</p>
<<elseif $flags.alessiaKeyContactRule eq "no-bait">>
<<actor bestfriend>>(text) On route. No fake unlock, no cropped photo, no extra story.<</actor>>
<</if>>
<<if $flags.alessiaKeyParkStance eq "exact">>
<p class="delayed">The exact terms from the park stay intact: one route, one hour, nothing added.</p>
<<elseif $flags.alessiaKeyParkStance eq "trust">>
<p class="delayed">$girlfriendName set the limit you trusted. $bestfriendName follows it without trying to widen the hour.</p>
<<elseif $flags.alessiaKeyParkStance eq "repeat-boundary">>
<p class="delayed">$bestfriendName repeats the refusal once without turning it into a joke. The key remains with $girlfriendName.</p>
<</if>>
<<if $flags.alessiaKeyPickupStance eq "limit">>
<<actor bestfriend>>You could still end this early. I heard you downstairs, and I hear you now.<</actor>>
<<elseif $flags.alessiaKeyPickupStance eq "boundary">>
<<actor bestfriend>>No fake story about holding it. I only get the drive you actually agreed to.<</actor>>
<</if>>
<<actor bestfriend>>
<<if $flags.alessiaFridayDanceStance eq "private">>My phone is in my bag. You said no pictures last time, and there are no pictures tonight.<</if>>
<<if $flags.alessiaFridayDanceStance eq "look-away">>You looked away from the kiss last Friday. You cannot make this passenger seat disappear that easily.<</if>>
<<if $flags.alessiaFridayDanceStance eq "watch">>Last Friday you watched me instead of pretending the dance floor was empty. Tonight, watch the road.<</if>>
<<if $flags.alessiaFridayPanties eq "refuse">>My bag stays at my feet. You already said you were not carrying my clothes.<</if>>
<</actor>>
<span id="conv"></span>
<div id="options">
<<if $flags.alessiaKeyConsent neq "declined">>
<<you-choice "Keep it where I can see it.">>
<<actor bestfriend>><<if $flags.alessiaKeyConsent eq "sealed">>The pouch stays on my palm. Watch the road, not the seal.<</if>><<if $flags.alessiaKeyConsent eq "accepted">>I will keep my hand on the console. You still do not get to stare through every turn.<</if>><</actor>>
[[Finish the route|Key for an hour return][$flags.alessiaKeyDriveResponse = "visible"; $flags.alessiaKeyDriveDone = true]]
<</you-choice>>
<<you-choice "Leave the key alone and finish the hour.">>
<<actor bestfriend>>There you go. Both hands on the wheel, no timer questions, no checking my wrist.<</actor>>
[[Finish the route|Key for an hour return][$flags.alessiaKeyDriveResponse = "endure"; $flags.alessiaKeyDriveDone = true]]
<</you-choice>>
<<you-choice "Give it back now.">>
<<actor bestfriend>>Then the hour ends now. Pull into the forecourt and call her.<</actor>>
[[End the loan|Key for an hour return][$flags.alessiaKeyDriveResponse = "return-early"; $flags.alessiaKeyDriveDone = true]]
<</you-choice>>
<<else>>
<<you-choice "I said no to the handoff. Stop testing whether I meant it.">>
<<actor bestfriend>>You meant it. The key stayed with her. I am testing whether you can finish one drive without turning a clear answer into a crisis.<</actor>>
[[Finish the route|Key for an hour return][$flags.alessiaKeyDriveResponse = "declined"; $flags.alessiaKeyDriveDone = true]]
<</you-choice>>
<<you-choice "The drive still feels different, even without the key.">>
<<actor bestfriend>>Because you spent a week imagining me with it. That part was yours, not mine.<</actor>>
[[Finish the route|Key for an hour return][$flags.alessiaKeyDriveResponse = "declined-reflect"; $flags.alessiaKeyDriveDone = true]]
<</you-choice>>
<</if>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !$flags.alessiaKeyDriveDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-hour-return.png'" alt="The lit return point at the end of the drive">
<p class="scene-lead">The drive has not reached its return point.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<elseif $flags.alessiaKeyReturnDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath + 'story/owned/ch7/key-hour-return' + ($flags.alessiaKeyConsent === 'declined' ? '' : '-transfer') + '.png'" alt="Jenny holding the returned cage key">
<p class="scene-lead"><<if $flags.alessiaKeyTransferOccurred>>The key is already back with $girlfriendName.<<else>>The drive is resolved, and the key never left $girlfriendName.<</if>></p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath + 'story/owned/ch7/key-hour-return' + ($flags.alessiaKeyConsent === 'declined' ? '' : '-transfer') + '.png'" alt="Jenny receiving the cage key at the lit return point">
<h2 class="scene-title">At the return point</h2>
<p class="scene-lead">The car rolls beneath the white lights outside $girlfriendName's apartment. She is waiting by the entrance.</p>
<<if $flags.alessiaKeyConsent eq "declined">>
<p>$girlfriendName lifts the key from her own chain before you open the door. It never left her possession.</p>
<<actor girlfriend>>You said no, I kept it, and you still completed the drive. That is the complete report.<</actor>>
<<elseif $flags.alessiaKeyDriveResponse eq "return-early">>
<p>$bestfriendName steps out and places <<if $flags.alessiaKeyConsent eq "sealed">>the sealed pouch<<else>>the key<</if>> directly into $girlfriendName's waiting hand.</p>
<<actor girlfriend>>Twenty minutes. You ended it early, she returned it, and the cage stayed locked. That was allowed.<</actor>>
<<elseif $flags.alessiaKeyConsent eq "sealed">>
<p>At exactly one hour, $bestfriendName lays the clear pouch in $girlfriendName's palm. $girlfriendName turns it under the light and checks the unbroken seal.</p>
<<actor girlfriend>>One full hour. The seal is untouched, just like you asked.<</actor>>
<<else>>
<p>At exactly one hour, $bestfriendName drops the brass key into $girlfriendName's palm. $girlfriendName closes her fingers around it before looking at you.</p>
<<actor girlfriend>>One full hour. She held it, you stayed locked, and it came straight back to me.<</actor>>
<</if>>
<<actor bestfriend>>
<<if $flags.alessiaKeyConsent eq "declined">>He checked your neck twice before we left and still looked relieved when he saw the key again. Impressive work with an object you never gave me.<</if>>
<<if $flags.alessiaKeyConsent neq "declined" && $flags.alessiaKeyDriveResponse eq "return-early">>He lasted twenty minutes and used the rule exactly once. I even returned him without an essay.<</if>>
<<if $flags.alessiaKeyConsent neq "declined" && $flags.alessiaKeyDriveResponse neq "return-early">>The timer was almost disappointing. His face did all the work.<</if>>
<</actor>>
<div class="continue-links">
<<link "Go upstairs together.">><<run setup.finishAlessiaKeyHour()>><<set $storyBeat = "alessia-key-returned">><<goto "Key for an hour debrief">><</link>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !$flags.alessiaKeyReturnDone || $flags.alessiaKeyCurrentHolder neq "jenny">>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-hour-debrief.png'" alt="Jenny waiting to debrief with the cage key">
<p class="scene-lead">The debrief waits until the drive is resolved and the key is back with $girlfriendName.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<elseif $flags.alessiaKeyChapterDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-hour-debrief.png'" alt="Jenny wearing the cage key again">
<p class="scene-lead">The key is back on $girlfriendName's chain after the drive.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/ch7/key-hour-debrief.png'" alt="Jenny holding the returned cage key during the private debrief">
<h2 class="scene-title">Her key again</h2>
<p class="scene-lead">Upstairs, $girlfriendName clips the key back onto her chain before she sits beside you. $bestfriendName's final message is already open on her phone.</p>
<p class="delayed">She places your hand over the key and leans against your shoulder. The experiment is over. Nothing else is waiting for an answer tonight.</p>
<<actor girlfriend>>
<<if $flags.alessiaKeyConsent eq "declined">>She asked, you said no, and I kept the key. You still gave her the ride without surrendering the boundary.<</if>>
<<if $flags.alessiaKeyDriveResponse eq "return-early">>You agreed, tried it, and ended the loan early. She returned it immediately. That is what the rule was for.<</if>>
<<if $flags.alessiaHeldKeyForHour && $flags.alessiaKeyConsent eq "sealed">>She held the sealed pouch for the full hour. You knew the key was beside you, and the seal gave you the limit you asked for.<</if>>
<<if $flags.alessiaHeldKeyForHour && $flags.alessiaKeyConsent eq "accepted">>She held your key for the full hour. You stayed locked, finished the drive, and brought it back to me.<</if>>
<</actor>>
<<actor bestfriend>>
(text) Final report: <<if $flags.alessiaKeyConsent eq "declined">>he drove me home without turning his no into another argument.<<elseif $flags.alessiaKeyDriveResponse eq "return-early">>he ended the loan early and used the rule exactly once.<<else>>he can drive, breathe, and follow a timer at the same time. he barely managed all three.<</if>> Your key is back where you like it. 💅
<</actor>>
<span id="conv"></span>
<div id="options">
<<if $flags.alessiaKeyConsent neq "declined">>
<<you-choice "I hated knowing she had it, and I kept driving.">>
<<actor girlfriend>>I know. You did not have to enjoy the hour for your agreement to count.<</actor>>
[[Close the report.|Post Key Sister Checkin][$flags.alessiaKeyDebriefStance = "endured"; $flags.alessiaKeyChapterDone = true; $flags.alessiaKeyCurrentHolder = "jenny"; $flags.alessiaKeyReturned = true; $flags.fridayDateStage = Math.max(7, $flags.fridayDateStage || 0); $storyBeat = "alessia-key-hour-complete"]]
<</you-choice>>
<<you-choice "The timer and the rules are why I agreed.">>
<<actor girlfriend>>Then the rules did their job. One hour meant one hour, and early return stayed available.<</actor>>
[[Close the report.|Post Key Sister Checkin][$flags.alessiaKeyDebriefStance = "structured"; $flags.alessiaKeyChapterDone = true; $flags.alessiaKeyCurrentHolder = "jenny"; $flags.alessiaKeyReturned = true; $flags.fridayDateStage = Math.max(7, $flags.fridayDateStage || 0); $storyBeat = "alessia-key-hour-complete"]]
<</you-choice>>
<<else>>
<<you-choice "I needed my no to stay simple.">>
<<actor girlfriend>>It did. She never held the key, and nobody punished you for answering clearly.<</actor>>
[[Close the report.|Post Key Sister Checkin][$flags.alessiaKeyDebriefStance = "declined"; $flags.alessiaKeyChapterDone = true; $flags.alessiaKeyCurrentHolder = "jenny"; $flags.alessiaKeyReturned = true; $flags.fridayDateStage = Math.max(7, $flags.fridayDateStage || 0); $storyBeat = "alessia-key-hour-complete"]]
<</you-choice>>
<</if>>
<<you-choice "This does not become automatic next Friday.">>
<<actor girlfriend>><<if $flags.alessiaKeyConsent eq "declined">>It does not. One drive after a no does not create a different answer next Friday.<<else>>It does not. Finishing this drive does not make another loan automatic.<</if>><</actor>>
[[Close the report.|Post Key Sister Checkin][$flags.alessiaKeyDebriefStance = "limit"; $flags.alessiaKeyChapterDone = true; $flags.alessiaKeyCurrentHolder = "jenny"; $flags.alessiaKeyReturned = true; $flags.fridayDateStage = Math.max(7, $flags.fridayDateStage || 0); $storyBeat = "alessia-key-hour-complete"]]
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !$flags.alessiaKeyChapterDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/late/sister-visit.jpg'" alt="Becky waiting in the bedroom doorway">
<p class="scene-lead">This conversation waits until the key-hour debrief is complete.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<elseif $flags.postKeySisterCheckinDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/late/sister-visit.jpg'" alt="Becky after her morning check-in">
<p class="scene-lead">Your step-sister has already checked that the key came home with $girlfriendName.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<else>>
<<if $gameDate.getDay() eq 5 && $gameDate.getHours() gte 18>><<run setup.advanceToNextMorning()>><</if>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/late/sister-visit.jpg'" alt="Becky leaning into the bedroom doorway on Saturday morning">
<h2 class="scene-title">The morning after</h2>
<p class="scene-lead">Back in your room the next morning, $sisterName leans through the open door. She watched $girlfriendName leave after breakfast with the brass key resting on her chain.</p>
<<actor sister>>
She still has it. You watched that key all the way to the front door, so whatever happened with $bestfriendName, nobody lost the important part.
I'm not asking for details. I just need to know whether this becomes another whole week where you stare at your phone and forget the dishes.
<</actor>>
<<actor-thought you>>
<<if $flags.alessiaKeyConsent eq "declined">>$sisterName does not know there was no handoff, only a drive built around an answer you kept.<</if>>
<<if $flags.alessiaKeyTransferOccurred && $flags.alessiaHeldKeyForHour>>She does not know $bestfriendName held the key for the full hour before placing it back in $girlfriendName's hand.<</if>>
<<if $flags.alessiaKeyTransferOccurred && !$flags.alessiaHeldKeyForHour>>She does not know you ended the loan early or how quickly $girlfriendName took the key back.<</if>>
She only sees that Saturday morning looks ordinary again.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "The key came back. That's enough.">>
<<set $flags.postKeySisterCheckinDone = true>>
<<set $storyBeat = "post-key-sister-checkin">>
<<actor sister>>All right. Normal answer from the least normal guy in the house. Do the dishes before you start another experiment.<</actor>>
<div class="delayed continue-links"><<if $work && $work neq "unemployed">>[[Get dressed and face Saturday|Home]]<<else>>[[Let Saturday settle|End of content chat]]<</if>></div>
<</you-choice>>
<<you-choice "The rules held. Leave it there.">>
<<set $flags.postKeySisterCheckinDone = true>>
<<set $storyBeat = "post-key-sister-checkin">>
<<actor sister>>Okay. You set a line and they listened. Still weird, but clear. I can leave clear alone.<</actor>>
<div class="delayed continue-links"><<if $work && $work neq "unemployed">>[[Get dressed and face Saturday|Home]]<<else>>[[Let Saturday settle|End of content chat]]<</if>></div>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<set $flags.caughtStroking1 = true>>
<<set $flags.anniversaryTonight = false>>
<<set $flags.questHint = "">>
<p class="delayed">
You told yourself it would take a minute. Class had left you shaking, and there was still time before you met her at the fountain.
The door opens while your hand is still moving.
</p>
<img class="hero-img centered" @src="setup.ImagePath+'story/act2/caught-door.jpg'" alt="caught by girlfriend">
<<actor girlfriend>>What the fuck, $youName?! Put that away!<</actor>>
<<actor girlfriend>>I thought you stopped doing this whenever you got bored.<</actor>>
<<actor you>>Ahh, $girlfriendName?! What are you doing here... who let you in?<</actor>>
<<actor girlfriend>>
$sisterName. Because I said I might come over for our anniversary. Because we said after school, fountain, then here, then us.
<</actor>>
<<actor girlfriend>>
I waited. You weren't there. So I came to find my boyfriend... and found this instead.
<</actor>>
<<actor-thought you>>
She took your arm in the hallway and asked you to show up for your anniversary. Instead, she has found you here with your cock still hard and dread tightening your stomach.
<</actor-thought>>
<div id="conv"></div>
<span id="options">
<<you-answer "I'm sorry, I was a mess after class. I panicked. 😞">>
<<actor girlfriend>>
If you were panicking, you could have texted me or shown up when you said you would.
But... at least you're admitting that you messed up.
<</actor>>
<<actor girlfriend>>
You still owe me tonight, and now we're doing it on my terms. Get down and take care of me.
[[Lick her |Lick GF][$girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1)]]
<</actor>>
<</you-answer>>
<<you-answer "Where were YOU? I didn't see you at the fountain.">>
<<actor girlfriend>>
I was with $bullyName. He needed help with homework after that whole display in class. Fifteen minutes. You couldn't wait fifteen minutes?
<</actor>>
<<actor girlfriend>>
Maybe I should go. Celebrate alone.
<</actor>>
<</you-answer>>
<<you-choice "Please, don't go. I'll make it up to you.">>
<<actor girlfriend>>
Then stop talking and use your mouth. Our anniversary is still happening, but I'm deciding how.
[[Lick her |Lick GF]]
<</actor>>
<</you-choice>>
<<you-choice "Fine. Leave if you want.">>
<<actor girlfriend>>
Okay. Enjoy your hand.
<</actor>>
<<set $relationshipState = "no-favor">>
<<set $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 3)>>
<p class="delayed">She doesn't slam the door. She closes it carefully, like she's already decided something about you.</p>
[[Bye |Are sleepy]]
<</you-choice>>
</span>
<</nobr>><<nobr>>
<img class="hero-img centered porn-frame" @src="setup.ImagePath+'story/act2/lick-gf-jenny-bed.png'" alt="Jenny on the bed">
<img @src="setup.ImagePath+'sex/licking.png'">
<<set $relationshipState = "cum-covered-pussy-licked">>
<p class="delayed">
She sits on the edge of your bed as if the room belongs to her. Her fingers close in your hair with enough pressure to guide you down.
You kneel and put your mouth on her. Beneath the familiar taste is a richer, saltier edge that you cannot place.
You blame her pill, stress, anything that will let you keep going without asking.
</p>
<span id="conv"></span>
<span id="options">
<<you-choice "Honey... you smell different. Taste different.">>
<<set $flags.noticedSmell = true>>
<<actor girlfriend>>
Maybe because I stopped taking my pill. Or maybe because I've been wet since the hallway.
Stop diagnosing me and lick.
<</actor>>
<<actor-thought you>>
Her answer comes too quickly and sounds too practiced. You promise yourself you will think about it later, while her thighs tremble against your ears.
<</actor-thought>>
[[Continue licking and finish her off |Finish Licking]]
<</you-choice>>
<<you-choice "Keep licking. Don't ask.">>
<<set $flags.keptQuietSmell = true>>
<<actor girlfriend>>
Ahh... yes, $youName, just like that. Good...
<</actor>>
<<actor-thought you>>
You stay quiet because a question might stop her or drag the classroom back into the room with you.
You press closer and listen to her moan instead.
<</actor-thought>>
[[Finish her |Finish Licking]]
<</you-choice>>
</span>
<</nobr>><<nobr>>
<<actor girlfriend>>Ah... yes... I'm coming, $youName, don't you dare stop, <</actor>>
<p class="delayed">She comes hard, fisting the sheets while her thighs lock around your head and hold you there.</p>
<img @src="setup.ImagePath+'sex/orgasm-licking.png'">
<div id="conv"></div>
<span id='options'>
<<identity-choice resistance "What about me?">>
<<actor girlfriend>>
For what? You already took care of yourself. That's the problem.
<</actor>>
<<if $flags.noticedSmell>>
<<actor-thought you>>
Her taste still sits on your tongue, but her explanation does not settle. You cannot bring yourself to press her tonight.
<</actor-thought>>
<<else>>
<<actor-thought you>>
Your cock throbs without being touched. Being ignored on your own anniversary should kill the mood, but instead it makes you harder.
<</actor-thought>>
<</if>>
[[Bye |Jerk off][$aroused = 80; _ab = setup.applyIdentity("act2-catch-assert")]]
<</identity-choice>>
<<identity-choice devotion "Hope that made up for it...">>
<<if $flags.keptQuietSmell>>
<<actor girlfriend>>
It helped. You're good when you shut up and work. We should do that more.
It's late. I should go. Text me tomorrow, and keep your hands off yourself if you can manage it.
<</actor>>
[[Bye |Are sleepy][_ab = setup.applyIdentity("act2-catch-appease"); $girlfriendTrustLevel = setup.changeFavor(1); $aroused = 40]]
<<else>>
<<actor girlfriend>>
That was pretty good. We should do it more often. It's late... I should go home.
Next time... show up when you say you will.
<</actor>>
[[Bye |Are sleepy][_ab = setup.applyIdentity("act2-catch-appease"); $aroused = 50]]
<</if>>
<</identity-choice>>
</span>
<</nobr>><<nobr>>
<<set $flags.caughtStroking2 = true>>
<p class="delayed">
$teacherName's lecture about locking up smaller boys is still in your head, along with her claim that it protects women from bad decisions.
<<if $flags.day25TriedToObey>>You made it through the shower, your messages, and nearly two hours in bed. Then you told yourself that checking the ache was not the same as stroking. The first touch lasted a second. The next one did not.<<else>>$girlfriendName said things would be fine as long as you followed the rules. You convince yourself that one stroke cannot count, then let yourself take another.<</if>>
The door opens without a knock.
</p>
<img class="hero-img centered" @src="setup.ImagePath+'story/act2/caught-door.jpg'" alt="caught again">
<<actor girlfriend>><<if $flags.caughtStroking1>>Are you serious? You couldn't even last one day?<<else>>Are you serious? I gave you one rule for one evening.<</if>><</actor>>
<<actor-thought you>>
Her voice cracks on the last word. Beneath the anger, you hear that she has reached a decision.
<</actor-thought>>
<div id="conv"></div>
<div id="options">
<<if $flags.caughtStroking1>>
<<you-answer "You didn't even finish me last time... I was still dying, ">>
<<actor girlfriend>>That isn't an excuse. We were supposed to continue together, not have you sneak off and do this again.<</actor>>
<<actor girlfriend>>$teacherName was right about one thing. Some boys can't be trusted with their own dicks.<</actor>>
<</you-answer>>
<<else>>
<<you-answer "I tried to stop. I really did.">>
<<actor girlfriend>>Trying until you wanted it badly enough is not the same as keeping the rule.<</actor>>
<<actor girlfriend>>$teacherName was right about one thing. Some boys can't be trusted with their own dicks.<</actor>>
<</you-answer>>
<</if>>
<<you-choice "Stay silent. Face burning.">>
<p class="delayed">Footsteps approach in the hall, and you hear $sisterName before she reaches the doorway.</p>
<<actor sister>>Okay, what is the screaming about, oh.<</actor>>
<<actor girlfriend>><<if $flags.caughtStroking1>>Your brother is a jerk-junkie. Even after our anniversary and what happened in class, he still can't keep his hand off it.<<else>>Your brother got one rule after class and still couldn't keep his hand off it.<</if>><</actor>>
<<actor sister>>
Bro. You have a girlfriend and you still live in your palm? That's actually sad.
My ex was the same. Until someone took the option away.
<</actor>>
<<actor sister>>
$girlfriendName, come with me a sec. I have something that fixes this kind of boy. Quietly.
<</actor>>
<<actor-thought you>>
$sisterName sounds prepared, as if she has been waiting for a reason to step in.
<</actor-thought>>
<span class="delayed">They leave together and lower their voices in the hall. By the time they reach $sisterName's room, they sound friendly.</span>
[[*Follow them quietly*|Girlfriend receives cage][$followedSisterReceivingCage to true]]
[[*Stay. Pretend this isn't happening.*|Girlfriend puts on the cage][$followedSisterReceivingCage to false]]
<</you-choice>>
</div>
<</nobr>><<nobr>>
<p class="delayed">
You follow them until you reach $sisterName's half-open door. You know you should turn back, but you lean closer to listen.
</p>
<img class="hero-img centered" @src="setup.ImagePath+'story/act2/cage-sister-handoff.jpg'" alt="sister offers the cage">
<<actor sister>>
Use this one. It's small enough that he can't slip out. He'll complain for a week, then start begging whenever you pay attention to him.
<</actor>>
<<actor girlfriend>>
We covered chastity and keyholder control in class today. They called it beta management.
<</actor>>
<<actor sister>>
Bingo. Once it's on, he can't stroke without you knowing. You hold the key and decide when he gets any relief.
I used something like this on my ex. He cried the first night. On night three he was texting me "please" like it was a love language.
<</actor>>
<<actor girlfriend>>
That might actually work for him. Maybe for us too.
<</actor>>
<<actor sister>>
Make him choose between wearing it and losing you. He'll agree before he realizes that was the only choice you gave him.
<</actor>>
<img @src="setup.ImagePath+'toys/chastity.png'" class="delayed">
<p class="delayed">Your mouth goes dry, but your cock stays stupidly hard under your clothes as if your body has misunderstood every word.</p>
[[*Run back to your room*|Girlfriend puts on the cage]]
<</nobr>><<nobr>>
<<if $followedSisterReceivingCage>>
<p class="delayed">You make it back to the bed before they return and act as if you never left. Neither of them bothers to challenge the lie.</p>
<<else>>
<p class="delayed">The wait drags on. When they return, $girlfriendName looks calmer because she has decided exactly what she is going to do.</p>
<</if>>
<img class="hero-img centered" @src="setup.ImagePath+'story/act2/cage-lock-ready.jpg'" alt="keyholder ready to lock">
<<actor girlfriend>>Look what $sisterName gave me.<</actor>>
<img @src="setup.ImagePath+'toys/chastity.png'" class="delayed">
<<if ($alphaBeta || 0) gte 4>>
<<actor girlfriend>>You've been soft for me for a while. This just makes it honest. Pants down.<</actor>>
<<elseif ($alphaBeta || 0) lte -4>>
<<actor girlfriend>>You can fight every label at school. In this room, you still broke my rule. Pants down.<</actor>>
<<elseif $girlfriendTrustLevel lte 5>>
<<actor girlfriend>>I'm done arguing. This goes on now.<</actor>>
<<elseif $followedSisterReceivingCage>>
<<actor girlfriend>>You heard enough, didn't you? Good. Then you know I'm not bluffing.<</actor>>
<<else>>
<<actor girlfriend>>Class said lock what can't be trusted. You proved the point. Let's put it on.<</actor>>
<</if>>
<<actor sister>>
I'll be in my room. Don't break my toy on day one, $girlfriendName. And bro... breathe. It's smaller than your ego.
<</actor>>
<span class="delayed">$sisterName leaves with a little wave and closes her door. You are alone with $girlfriendName, but the room no longer feels private.</span>
<span id="conv"></span>
<span id="options">
<<you-answer "What is this for?">>
<<actor girlfriend>>
It's a chastity cage that locks around your cock. I keep the key, so you only get relief when I decide you deserve it.
<</actor>>
<</you-answer>>
<<you-answer "That looks like it hurts.">>
<<actor girlfriend>>
$sisterName said it only hurts at first. Then everything gets quieter, and you can focus on me instead of touching yourself.
<</actor>>
<</you-answer>>
<<you-choice "Okay... if it means you'll stay. 🙁">>
<<actor girlfriend>>
Smart choice. You picked us, and I'll remember that you said it willingly.
<</actor>>
[[Put it on|Girlfriend locked you up][$cageAcceptance = "reluctant"]]
<</you-choice>>
<<identity-choice devotion "If you want me locked... I want it too. 😳">>
<<if $girlfriendTrustLevel gt 5>>
<<actor girlfriend>>
Oh. Look at you trying to make it romantic. Come here.
<</actor>>
<<else>>
<<actor girlfriend>>
Finally, you're being useful. Don't take it back when you hear the click.
<</actor>>
<</if>>
[[Put it on|Girlfriend locked you up][$cageAcceptance = "eager"; _ab = setup.applyIdentity("act2-cage-eager"); $girlfriendTrustLevel = setup.changeFavor(1)]]
<</identity-choice>>
<<you-choice "No. I'm not putting that on.">>
<<actor girlfriend>>
Are you sure? $teacherName was right. Without this, I won't stay. I'm not competing with your hand anymore.
<</actor>>
[[Okay... then put it on. 🙁|Girlfriend locked you up][$cageAcceptance = "forced"]]
<<identity-link "resistance" "Then go. I don't need you." "End lost girlfriend">><<set $cageAcceptance = "refused">><<run setup.applyIdentity("act2-cage-refuse")>><<set $flags.mustResolveCage = false>><<set $flags.questHint = "">><</identity-link>>
<</you-choice>>
</span>
<</nobr>><<nobr>>
<<run setup.updateProgression("Caged", 3)>>
<<set $flags.mustResolveCage = false>>
<<set $flags.questHint = "">>
<<set $flags.day25RulesWarning = false>>
<img @src="setup.ImagePath+'gf-you/lockup.webp'">
<p class="delayed">
The metal is cold against your skin. Her fingers move carefully as she checks the fit, settles you inside, and closes the lock.
The click is quiet, yet it seems to fill the room.
</p>
<<if $cageAcceptance eq "eager">>
<<actor girlfriend>>
Hear that? You asked for this. You're mine now, and your hand doesn't get a say anymore.
[[Let's have some fun][$caged = true; $strokeState = "caged"]]
<</actor>>
<<elseif $cageAcceptance eq "reluctant">>
<<actor girlfriend>>
There. Breathe. I'm proud of you for choosing us. We'll learn the rules together.
[[Let's have some fun][$caged = true; $strokeState = "caged"]]
<</actor>>
<<else>>
<<actor girlfriend>>
Yes. Finally, I don't have to hear "just once" again.
[[Let's have some fun][$caged = true; $strokeState = "caged"]]
<</actor>>
<</if>>
<</nobr>><<nobr>>
<span id="conv">
<<if $cageAcceptance eq "eager">>
<<actor girlfriend>>You wanted the cage. Now show me that mouth still works when the rest of you doesn't.<</actor>>
<<elseif $cageAcceptance eq "reluctant">>
<<actor girlfriend>>You can't fuck me with that on. So you serve. That's how we keep this fair... for me.<</actor>>
<<else>>
<<actor girlfriend>>Because you can't have sex with that thing on, you pleasure me another way. On your knees is fine.<</actor>>
<</if>>
</span>
<<actor-thought you>>
The cage is already warming against your skin. Every pulse reminds you that the key is in her hand, beyond your reach.
You could still refuse and ruin whatever remains between you. Before you finish arguing with yourself, your knees touch the floor.
<</actor-thought>>
<span id="options">
<<you-choice "Yes, $girlfriendName... 😕">>
<<if $cageAcceptance eq "eager">>
<<actor girlfriend>>
Ahhh... see? This is what you're for, and it already feels better. Don't you dare stop when I shake.
<</actor>>
<<elseif $flags.noticedSmell>>
<<actor girlfriend>>
Ahhh yes... just like that. Don't think or sniff for stories, just serve.
<</actor>>
<<else>>
<<actor girlfriend>>
Ahhh... yes, you're getting better. This is better than sex with you ever was.
<</actor>>
<</if>>
<img class="delayed" @src="setup.ImagePath+'gf-you/chastity-lick.png'" class="delayed">
<<actor girlfriend>>
Mmm... stay right there. You're much easier to enjoy like this, honey.
Keep the cage clean. Keep your hands off it. And stay awake, I'm not done owning tonight.
[[Continue, keyholder night|Cage rules night][$refusedToLick = false; $aroused = 70; $flags.firstServiceDone = true; $storyAct = 3]]
<</actor>>
<</you-choice>>
<<you-choice "No. If I can't cum, you don't get to either.">>
<<if $cageAcceptance eq "eager">>
<<actor girlfriend>>
You asked me to lock you, and now you're refusing? Fine. Stay frustrated while I explain the rules.
[[Continue, keyholder night|Cage rules night][$refusedToLick = true; $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 2); $aroused = 90; $storyAct = 3]]
<</actor>>
<<else>>
<<actor girlfriend>>
If that's what you wish for. Enjoy the ache. I still have the key.
Rules first. Then you can be mad about them.
[[Continue, keyholder night|Cage rules night][$refusedToLick = true; $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1); $aroused = 85; $storyAct = 3]]
<</actor>>
<</if>>
<</you-choice>>
</span>
<</nobr>><<nobr>>
<<set $flags.questHint = "">>
<<set $storyAct = 3>>
<<set $storyBeat = "key-rules">>
<div class="scene-panel compact">
<img class="hero-img centered porn-frame" @src="setup.ImagePath+'girlfriend/keyholder-key-smile.jpeg'" alt="keyholder with key">
<p class="delayed">That evening, $girlfriendName sits on your bed in blue and lets the key swing from one finger. You have been locked long enough for the metal to feel warm.</p>
<<actor girlfriend>>
We need to talk about how this works. Listen, then tell me you understand.
<</actor>>
<<actor girlfriend>>
You do not try to unlock it, even to clean or check the fit. You ask me.
If you're desperate, tell me. I might tease you, and I might make you wait, but I want to know.
When I go out, you stay home unless I say otherwise. No following me and no checking up on me.
You can use your mouth and hands on me. Toys are my call, and your cock stays locked until I decide differently.
<</actor>>
<img class="delayed centered porn-frame" @src="setup.ImagePath+'girlfriend/keyholder-bed-sit.jpg'" alt="keyholder on the bed">
<img class="delayed centered" @src="setup.ImagePath+'you/locked1.webp'" alt="already locked">
<<actor-thought you>>
She says it as if the two of you are settling a household routine. The key turns slowly between her fingers while she waits for you to answer.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<identity-choice devotion "I understand. You're the keyholder.">>
<<set $flags.keyRulesDone = true>>
<<set $flags.keyRulesStance = "devotion">>
<<actor girlfriend>>
There. You listen better when I have the key.
<</actor>>
<<run setup.applyIdentity("owned-rules-accept")>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<run setup.nudgeArousal(8)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<if !$flags.firstServiceDone>>
<div class="delayed">[[She isn't finished with you|Caged service]]</div>
<<else>>
<div class="delayed">[[Sleep on it|Home]]</div>
<</if>>
<</identity-choice>>
<<identity-choice resistance "This is temporary. Right?">>
<<set $flags.keyRulesDone = true>>
<<set $flags.keyRulesStance = "resistance">>
<<actor girlfriend>>
You can call it temporary if that helps.
I'm keeping the key until I decide I'm done with it.
<</actor>>
<<run setup.applyIdentity("owned-rules-temporary")>>
<<run setup.nudgeArousal(10)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<if !$flags.firstServiceDone>>
<div class="delayed">[[She pulls you closer anyway|Caged service]]</div>
<<else>>
<div class="delayed">[[Home with the argument unfinished|Home]]</div>
<</if>>
<</identity-choice>>
<<you-choice "What do I get if I make this easy for you?">>
<<set $flags.keyRulesDone = true>>
<<set $flags.keyRulesStance = "pragmatic">>
<<actor girlfriend>>
You get honesty about my plans, favors when you earn them, and fewer surprises.
Start by making me come. Then you can ask for your first favor.
<</actor>>
<<run setup.nudgeArousal(12)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<if !$flags.firstServiceDone>>
<div class="delayed">[[Earn the first favor|Caged service]]</div>
<<else>>
<div class="delayed">[[Home|Home]]</div>
<</if>>
<</you-choice>>
</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/night-out-leave.jpg'" alt="Jenny dressed to leave for the night">
<<if setup.isResistant() && $publicAlphaBeta lt 0>>
<p class="delayed">The public list calls you Alpha. Your private choices have pushed toward Resistance. None of that stops $girlfriendName from fastening the cage key around her neck and reaching for her bag.</p>
<<elseif setup.isResistant()>>
<p class="delayed">You have resisted her rules whenever she made you choose. She still fastens the cage key around her neck and reaches for her bag.</p>
<<else>>
<p class="delayed">$girlfriendName fastens the cage key around her neck, checks herself in the mirror, and reaches for her bag.</p>
<</if>>
<<actor girlfriend>>
Girls' night. The cage stays on, and you stay home. Do not wait up pretending you are not curious.
<</actor>>
<span id="conv"></span>
<div id="options">
<<identity-choice resistance "This is not okay with me.">>
<<set $flags.nightOutDepartureDone = true>>
<<set $flags.nightOutDepartureStance = "objected">>
<<run setup.applyIdentity("owned-night-confront")>>
<<actor girlfriend>>
I heard you. I am still going. We can argue when I get home, if you are still awake.
<</actor>>
<div class="delayed">[[Let the door close|Wait until evening]]</div>
<</identity-choice>>
<<you-choice "Let her leave. Save the argument for later.">>
<<set $flags.nightOutDepartureDone = true>>
<<set $flags.nightOutDepartureStance = "quiet">>
<<actor girlfriend>>
Then lock the door behind me, baby.
<</actor>>
<div class="delayed">[[Listen to her leave|Wait until evening]]</div>
<</you-choice>>
</div>
</div>
<</nobr>><<nobr>>
<<set $flags.noticedSmell = true>>
<<set $storyBeat = "night-out">>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/night-out-wait.jpg'" alt="waiting locked at home">
<<if $flags.nightOutDepartureStance eq "objected">>
<p class="delayed">You told her the night out was not okay. She left anyway. It is late now, and every shift on the sofa presses the cage against you.</p>
<<else>>
<p class="delayed">She said “girls' night.” It is late now, and every shift on the sofa presses the cage against you.</p>
<</if>>
<<actor-thought you>>
You check your phone again, then picture her with someone who can actually fuck her. Neither makes the waiting easier.
<</actor-thought>>
<img class="hero-img centered delayed" @src="setup.ImagePath+'story/owned/night-out-leave.jpg'" alt="she left for the night">
<p class="delayed">A key turns in the front door. $girlfriendName comes in with messy hair and flushed cheeks, her cage key hanging between her tits. She smells like night air and someone else's cologne.</p>
<img class="hero-img centered porn-frame delayed" @src="setup.ImagePath+'cuckold/night-out-return.jpg'" alt="she comes home ruined and proud">
<img class="delayed centered" @src="setup.ImagePath+'cuckold/x-tease-'+ random(1, 4) +'.gif'" alt="">
<<actor girlfriend>>
<<if $flags.nightOutDepartureStance eq "objected">>Still up? You can say you objected again, if it makes you feel better.<br><<else>>Still up? Of course you are. You have been sitting here waiting with that thing locked all night.<br><</if>>
I had fun. You look like you've been imagining every minute of it.
If you're good, maybe I let you clean me up later.
<</actor>>
<span id="conv"></span>
<div id="options">
<<if $flags.nightOutDepartureStance eq "objected">>
<<you-choice "No. No more men. If we stay together, that stops.">>
<<set $flags.nightOutSmellDone = true>>
<<set $flags.noAlphaBoundary = true>>
<<set $flags.noAlphaBoundaryOrigin = "night-out">>
<<set $flags.keptQuietSmell = false>>
<<actor girlfriend>>
Okay. I should not have walked out after you said it was not okay.
No $bullyName, no $exfriendName, no other guy. I keep your key, but I do not get to turn that into permission you never gave me.
<</actor>>
<p class="delayed">She takes the key from her neck and closes her hand around it. She does not unlock you. For once, that feels like two separate decisions.</p>
<<run setup.nudgeArousal(6)>>
<div class="delayed">[[Finish the conversation in the morning|Home][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</you-choice>>
<<you-choice "You cheated after I said no. We're done.">>
<<actor girlfriend>>
I cannot tell you that you imagined it. You said no before I left, and I went anyway.
If you mean this, I will unlock you. I will not make you stay just because I have the key.
<</actor>>
<p class="delayed">Her fingers close around the key. Ending the relationship means ending the cage with it.</p>
<div class="delayed continue-links">
<<link "Confirm: end the relationship" "End cheated breakup">><<set $flags.cheatingBreakupDone = true>><<set $flags.nightOutSmellDone = true>><<set $caged = false>><<set $strokeState = "free">><<set $relationshipState = "broken-up">><<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>><</link>>
[[Do not confirm|Night out return]]
</div>
<</you-choice>>
<<else>>
<<identity-choice resistance "I… I can smell him on you.">>
<<set $flags.nightOutSmellDone = true>>
<<actor girlfriend>>
Then you have a working nose. Use your mouth for something useful later, not questions.
<</actor>>
<<set $flags.keptQuietSmell = false>>
<<run setup.applyIdentity("owned-night-confront")>>
<<run setup.peakArousal()>>
<div class="delayed">[[She pushes you to your knees|Caged service][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</identity-choice>>
<</if>>
<<identity-choice devotion "Did you have a good night?">>
<<set $flags.nightOutSmellDone = true>>
<<actor girlfriend>>
Mm. Better than staying home. You can ask me about it tomorrow, when you are less worked up.
<</actor>>
<<set $flags.keptQuietSmell = true>>
<<run setup.applyIdentity("owned-night-approve")>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<run setup.nudgeArousal(12)>>
<div class="delayed">[[Kiss her cheek. Taste the night.|Home][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</identity-choice>>
<<you-choice "Say nothing. Stare at the key.">>
<<set $flags.nightOutSmellDone = true>>
<<actor girlfriend>>
That face tells me enough. Go to bed and leave the cage alone.
<</actor>>
<<set $flags.keptQuietSmell = true>>
<<run setup.peakArousal()>>
<div class="delayed">[[To bed aching|Home][$gameDate = setup.changeDate($gameDate, 'hours', 2)]]</div>
<</you-choice>>
</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img centered porn-frame" @src="setup.ImagePath+'girlfriend/keyholder-key-smile.jpeg'" alt="Jenny keeps the cage key">
<p class="delayed">In the morning, $girlfriendName sits beside you with the key resting against her chest. The argument is over. The boundary is not.</p>
<<actor girlfriend>>
<<if $flags.noAlphaBoundaryOrigin eq "night-out">>I ignored you before I left. I will not pretend the apology fixes that, but I heard the boundary. No $bullyName, no $exfriendName, no replacement waiting offscreen.<<elseif $flags.noAlphaBoundaryOrigin eq "ultimate-stop">>You stopped the room and I listened. No $bullyName, no $exfriendName, no replacement waiting offscreen.<<else>>I heard the boundary. No $bullyName, no $exfriendName, no replacement waiting offscreen.<</if>>
You are still my boyfriend. I am still your keyholder, if that is what we choose together.
<</actor>>
<<actor-thought you>>
The cage is still locked. Her thumb still circles the key. The difference is that neither of you is pretending the metal answered a question about other men.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "Keep the cage. Keep us. No other men.">>
<<set $flags.noAlphaRelationshipDone = true>>
<<set $storyBeat = "no-alpha-keyholder">>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<actor girlfriend>>
Then those are the rules. I tease you, I decide when you unlock, and Friday stays ours.
If either of us wants to change that, we talk first. No surprises.
<</actor>>
<div class="delayed">[[Continue your life together|Home]]</div>
<</you-choice>>
</div>
</div>
<</nobr>><<nobr>>
<<set $flags.cagedWaitDone = true>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/caged-waiting.jpg'" alt="waiting locked">
<p class="delayed">She texts: <em>out. be good. no touching what you can't reach anyway 🔐</em></p>
<p class="delayed">An hour of nothing. Every shift of fabric reminds you. Your brain helpfully supplies what she might be doing.</p>
<img class="delayed centered" @src="setup.ImagePath+'cuckold/x-sex-'+ random(1, 5) +'.gif'" alt="">
<<actor girlfriend>>
(text) still waiting? good, because $bullyName says hi... or maybe he doesn't.
don't even try to cum without me, although we both know you can't. 😈
<</actor>>
<<run setup.peakArousal()>>
<div class="continue-links">
[[Try to stroke the cage anyway|Stroke cage]]
[[Lie down and suffer|Home][$gameDate = setup.changeDate($gameDate, 'hours', 2)]]
</div>
</div>
<</nobr>><<nobr>>
<<if $flags.cagedServiceDone>>
<<set $storyBeat = "first-service">>
<<include "Home">>
<<else>>
<<set $storyBeat = "first-service">>
<<set _rulesStance = $flags.keyRulesStance || "legacy">>
<div class="scene-panel compact">
<img class="hero-img centered porn-frame" @src="setup.ImagePath+'girlfriend/keyholder-bed-sit.jpg'" alt="she sits you down">
<<if _rulesStance eq "devotion">>
<p class="delayed">She lets you kiss the key before placing it on the nightstand. Then she pulls your face between her thighs with a pleased little smile.</p>
<<elseif _rulesStance eq "resistance">>
<p class="delayed">She leaves the argument unfinished. The key lands on the nightstand, and she makes you look at it before pulling your face between her thighs.</p>
<<elseif _rulesStance eq "pragmatic">>
<p class="delayed">She places the key on the nightstand like the first term in your deal. One favor, if you make her come and follow every rule she just gave you.</p>
<<else>>
<p class="delayed">She leaves you dressed and pulls your face between her thighs. Her fingers tighten in your hair. The keys stay on the nightstand, close enough to see and too far to touch.</p>
<</if>>
<img class="delayed centered porn-frame" @src="setup.ImagePath+'gf-you/service-facesit.jpg'" alt="service">
<<actor girlfriend>>
<<if _rulesStance eq "devotion">>Good boy. That's it, slower. You said you understood, so show me.<br><<elseif _rulesStance eq "resistance">>You can keep calling it temporary. Right now, the key stays there and your mouth stays here.<br><<elseif _rulesStance eq "pragmatic">>You wanted terms. Make me come, follow the rules, and you earn one favor.<br><<else>>That's it. Slower.<br><</if>>
Keep licking. Every time that cage clinks, I want you to remember which one of us gets to finish.
<</actor>>
<<actor-thought you>>
The metal presses into your thighs while she grinds against your mouth. She can feel every useless twitch through your clothes.
<</actor-thought>>
<img class="delayed centered" @src="setup.ImagePath+'gf-you/chastity-lick.png'" alt="">
<img class="delayed centered" @src="setup.ImagePath+'sex/licking.png'" alt="">
<img class="delayed centered" @src="setup.ImagePath+'sex/orgasm-licking.png'" alt="">
<<actor girlfriend>>
<<if _rulesStance eq "pragmatic">>You earned the favor. Ask when it matters, not while your face is wet.<br><<elseif _rulesStance eq "resistance">>You kept your boundary. I kept the key. We can argue again tomorrow.<br><<else>>Good. Stay there.<br><</if>>
You are not getting the key tonight. When $sisterName sees you tomorrow, try not to look so guilty. She'll know anyway.
<</actor>>
<<set $aroused = 90>>
<<if _rulesStance neq "resistance">><<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>><</if>>
<div class="continue-links">
[[Wipe your mouth and go downstairs.|Home][$flags.cagedServiceDone = true; $flags.firstServiceDone = true; $gameDate = setup.changeDate($gameDate, 'hours', 1)]]
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<set $flags.cagedVoyeurDone = true>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/caged-park-witness.jpg'" alt="park voyeur tension">
<p class="delayed">You only meant to walk off the ache. Past the bushes you hear a laugh that is not careful, a rhythm that is not yours.</p>
<img class="delayed centered" @src="setup.ImagePath+'cuckold/x-sex-'+ random(1, 5) +'.gif'" alt="">
<<actor-thought you>>
You can't see faces. You don't need to. In your head it is $girlfriendName and someone built like an ANWO poster.
Your cock jerks inside the cage and presses painfully against your jeans while you watch.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<identity-choice devotion "Stay. Watch.">>
<<actor-thought you>>
Shame and heat braid together. You leave only when your legs shake.
<</actor-thought>>
<<run setup.applyIdentity("owned-park-watch")>>
<<run setup.peakArousal()>>
<div class="delayed">[[Flee home throbbing|Home][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</identity-choice>>
<<identity-choice resistance "Leave before you confirm anything.">>
<<actor-thought you>>
You call it self-defense as you walk away, though the pressure under your jeans follows you home.
<</actor-thought>>
<<run setup.applyIdentity("owned-park-leave")>>
<<run setup.nudgeArousal(10)>>
<div class="delayed">[[Home before the image sticks|Home][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</identity-choice>>
</div>
</div>
<</nobr>><<nobr>>
<<set $storyBeat = "alpha-proof">>
/* Caption Snap rewards only come from Edge Report. */
<div class="phone" id="filterSuper">
<div class="topHeader">
<div>
<span id="timeCurrent"><<print $gameDate.getHours() + ':00'>> </span>
<i class="fa-brands fa-whatsapp fa-xl"></i>
</div>
<div>
<i class="fa-solid fa-wifi fa-lg" style="position: relative; bottom: 3px; margin-right: 3px"></i>
</div>
</div>
<div class="messages">
<<actor girlfriend>>
Don't freak out.
Or do. I like when you freak out quietly.
<</actor>>
<<actor girlfriend>>
(text) Had a "study" thing.
$bullyName walked me halfway to the car.
He asked if you were still "doing the locked experiment."
I said you're still doing what I tell you. 🔐
<</actor>>
<<actor girlfriend>>
Then I sent him the back-seat photo.
I told him to give me his number if he wanted to take me somewhere quieter.
<</actor>>
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/alpha-proof-car.jpg'" alt="parking lot proof energy">
<<actor girlfriend>>
That photo was not for you, baby. I wanted him to know I was interested.
Notice what's not in the shot?
Your cock. Because it's not invited.
<</actor>>
<<actor girlfriend>>
(text) Sleep hard. Text me "yes keyholder" if you're still mine.
I want my answer before you sleep. 😘
<</actor>>
<<actor-thought you>>
She called it studying. He only walked her halfway. Now she is in a car asking for his number.
You should put the phone down. Instead, you type with the cage digging into your lap.
<</actor-thought>>
</div>
<section class="phone-nav">
<div class="continue-links">
<<identity-link "devotion" "yes keyholder" "Home">><<set $flags.alphaProofDone = true>><<run setup.applyIdentity("owned-proof-answer")>><<set $aroused = $aroused gte 90 ? 100 : $aroused + 20>><<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>><</identity-link>>
<<identity-link "resistance" "Seen" "Home">><<set $flags.alphaProofDone = true>><<run setup.applyIdentity("owned-proof-seen")>><<set $aroused = $aroused gte 90 ? 100 : $aroused + 15>><</identity-link>>
</div>
<a data-passage="Phone chats" class="phone-back-btn link-internal">Chats</a>
</section>
</div>
<</nobr>>
/* === Act III: Proof becomes presence === */<<nobr>>
<<set $storyBeat = "hallway-hierarchy">>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/hallway-hierarchy.jpg'" alt="her with him in the hallway">
<p class="delayed">Between classes the hallway is a river of bodies. You almost walk past them, $girlfriendName and $bullyName, close enough that her shoulder brushes his chest when she laughs.</p>
<<actor-thought you>>
The cage sits warm under your clothes while she laughs against his chest. After the photo she sent him, you cannot pretend he knows nothing about the lock.
<</actor-thought>>
<<actor bully>>
Hey... locked experiment still going? She said you're still following her rules.
<</actor>>
<<actor girlfriend>>
He's right here. Don't make it a scene. Walk normal, baby.
<</actor>>
<span id="conv"></span>
<div id="options">
<<you-choice "Freeze. Nod. Say nothing.">>
<<set $flags.hallwayHierarchyDone = true>>
<<run setup.applyRecognition("owned-hallway-freeze")>>
<<actor bully>>
Damn, you really can't talk around me. Catch you later.
<</actor>>
<<actor girlfriend>>
Go to class. Text me when you're home.
<</actor>>
<<run setup.nudgeArousal(10)>>
<div class="delayed">[[Escape into the crowd|Home][$gameDate = setup.changeDate($gameDate, 'hours', 2)]]</div>
<</you-choice>>
<<you-choice "We're fine. Project stuff.">>
<<set $flags.hallwayHierarchyDone = true>>
<<actor bully>>
Sure. Project stuff. Try not to walk so stiff.
<</actor>>
<<actor girlfriend>>
You got a sentence out. Come on, we're going to be late.
<</actor>>
<<set $aroused = $aroused gte 80 ? 100 : $aroused + 20>>
<div class="delayed">[[Leave while you still have a voice|Home][$gameDate = setup.changeDate($gameDate, 'hours', 2)]]</div>
<</you-choice>>
<<identity-choice resistance "Walk past like you didn't see them.">>
<<set $flags.hallwayHierarchyDone = true>>
<<actor girlfriend>>
$youName, really? Avoiding me in public? We'll talk at home.
<</actor>>
<<actor-thought you>>
You feel his eyes on your back. The cage taps against you once when you hurry, loud enough to make your face burn.
<</actor-thought>>
<<run setup.applyIdentity("owned-hallway-avoid")>>
<<run setup.applyRecognition("owned-hallway-avoid")>>
<<set $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1)>>
<<run setup.nudgeArousal(8)>>
<div class="delayed">[[Home with a pit in your stomach|Home][$gameDate = setup.changeDate($gameDate, 'hours', 2)]]</div>
<</identity-choice>>
</div>
</div>
<</nobr>><<nobr>>
<<set $storyBeat = "bully-check-in">>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/bully-vending.jpg'" alt="bully by the vending machines">
<p class="delayed">You are alone by the vending machines until $bullyName walks over and blocks the buttons with one hand.</p>
<<actor bully>>
Relax. I only came for a drink. She told me about the lock, though. ANWO homework, right?
Had to see if you could still walk normal.
<</actor>>
<<if $cageAcceptance eq "eager">>
<<actor bully>>
She said you asked for it. Damn. You really wanted that cage, huh?
<</actor>>
<<elseif $cageAcceptance eq "forced">>
<<actor bully>>
She said you fought her on it. Guess that went well.
<</actor>>
<<elseif $cageAcceptance eq "reluctant">>
<<actor bully>>
She said you took some convincing. Your face says you still do.
<</actor>>
<<else>>
<<actor bully>>
Whatever you two call it, that look on your face is doing all the talking.
<</actor>>
<</if>>
<<if setup.isResist()>>
<<actor-thought you>>
You want to tell him to back off. You hear people at the end of the hall and lower your voice instead.
<</actor-thought>>
<<elseif setup.isEager()>>
<<actor-thought you>>
Part of you wants him to keep talking. Your cock swells painfully at the thought.
<</actor-thought>>
<<else>>
<<actor-thought you>>
He is barely trying to be mean. That somehow makes your face burn more.
<</actor-thought>>
<</if>>
<span id="conv"></span>
<div id="options">
<<identity-choice resistance "It's private. Between me and her.">>
<<set $flags.bullyCheckInDone = true>>
<<actor bully>>
Private? She sent me proof. Relax, I don't want your key.
Tell her I said hi. She likes watching you get nervous.
<</actor>>
<<run setup.applyIdentity("owned-bully-private")>>
<<run setup.applyRecognition("owned-bully-private")>>
<<run setup.nudgeArousal(8)>>
<div class="delayed">[[Get out before your voice cracks|Home][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</identity-choice>>
<<identity-choice devotion "I'm… taking it seriously.">>
<<set $flags.bullyCheckInDone = true>>
<<actor bully>>
Yeah, I can tell. Try not to waddle in the hall, man.
She'll get mad if you embarrass her.
<</actor>>
<<run setup.applyIdentity("owned-bully-serious")>>
<<run setup.applyRecognition("owned-bully-serious")>>
<<run setup.nudgeArousal(10)>>
<div class="delayed">[[Nod and leave before your face gives you away|Home][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</identity-choice>>
<<you-choice "Mumble something and stare at the floor.">>
<<set $flags.bullyCheckInDone = true>>
<<run setup.applyRecognition("owned-bully-mumble")>>
<<actor bully>>
There it is. The quiet little locked look. See you around, experiment.
<</actor>>
<<run setup.peakArousal()>>
<div class="delayed">[[Flee with your ears ringing|Home][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</you-choice>>
</div>
</div>
<</nobr>><<nobr>>
<<set $storyBeat = "bully-presence">>
<<set $storyAct = 3>>
<div class="scene-panel compact">
<img class="hero-img centered porn-frame" @src="setup.ImagePath+'girlfriend/keyholder-bed-stand.jpg'" alt="keyholder debrief">
<p class="delayed">That evening, $girlfriendName sits against the bed frame with her legs open. She drops the key on the nightstand and crooks one finger at you.</p>
<<actor girlfriend>>
So, he talked to you in the hallway by the vending machines.
I know... Because he texted me <em>your face</em> like a weather report.
<</actor>>
<<if $flags.keptQuietSmell>>
<<actor girlfriend>>
You keep hoping nobody notices. He did.
<</actor>>
<<elseif $flags.noticedSmell || $flags.nightOutSmellDone>>
<<actor girlfriend>>
Don't do the shocked eyes. You already had a nose full of the truth once.
Today he got to watch your face too.
<</actor>>
<<else>>
<<actor girlfriend>>
First I sent you the picture. Today I let him ask you about it. You handled that badly, by the way.
<</actor>>
<</if>>
<<if $cageAcceptance eq "eager">>
<<actor girlfriend>>
You wanted the cage. That means you get the embarrassing parts too. You do not get to hide whenever he walks over.
<</actor>>
<<elseif $cageAcceptance eq "forced">>
<<actor girlfriend>>
You didn't pick the cage. You still wear it. He knows. I like that he knows.
<</actor>>
<<elseif $cageAcceptance eq "reluctant">>
<<actor girlfriend>>
You looked ready to run in the hallway. Next time, stay beside me and breathe.
<</actor>>
<<else>>
<<actor girlfriend>>
My rules still count when we leave the bedroom. He can tease you, and you can survive it.
<</actor>>
<</if>>
<<actor girlfriend>>
Come here. Kiss the key. Then maybe I let you be useful under the sheets. It stays on tonight.
And stop acting surprised when he comes over. I like him knowing.
<</actor>>
<<actor-thought you>>
You kneel before you can think of an answer. The key is warm from her fingers when it touches your lips.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<identity-choice devotion "Yes, keyholder. I'm still yours.">>
<<set $flags.keyholderDebriefDone = true>>
<<set $flags.bullyPresenceDone = true>>
<<actor girlfriend>>
That's what I wanted to hear. Kiss the key, kneel when I point, and keep the cage on when you sleep.
<</actor>>
<<run setup.applyIdentity("owned-debrief-accept")>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<run setup.nudgeArousal(12)>>
<div class="delayed">[[Serve, then ache|Caged service][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</identity-choice>>
<<identity-choice resistance "I don't want him in this.">>
<<set $flags.keyholderDebriefDone = true>>
<<set $flags.bullyPresenceDone = true>>
<<actor girlfriend>>
I know you don't. I still like him here.
You can pout if you want, but you are still kissing that key before bed.
<</actor>>
<<run setup.applyIdentity("owned-debrief-reject")>>
<<run setup.nudgeArousal(10)>>
<div class="delayed">[[Bed with the argument unfinished|Home][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</identity-choice>>
<<identity-choice devotion "Kiss the key. Don't argue.">>
<<set $flags.keyholderDebriefDone = true>>
<<set $flags.bullyPresenceDone = true>>
<<actor girlfriend>>
You don't have to answer. Kiss it, then get in bed.
<</actor>>
<<run setup.applyIdentity("owned-debrief-kiss")>>
<<run setup.peakArousal()>>
<div class="delayed">[[Sleep owned|Home][$gameDate = setup.changeDate($gameDate, 'hours', 2)]]</div>
<</identity-choice>>
</div>
</div>
/* === Act III: Ultimate humiliation after bully presence === */
<</nobr>><<nobr>>
<<set $storyBeat = "ultimate-humiliation">>
<<set $storyAct = 3>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/late/ultimate-chair-setup.jpg'" alt="chair in the corner">
<img class="hero-img centered porn-frame delayed" @src="setup.ImagePath+'girlfriend/keyholder-bed-stand.jpg'" alt="before he arrives">
<p class="delayed">She points at the chair before you can sit on the bed. The cage has rubbed against you all day. $girlfriendName taps one nail against it and watches you flinch.</p>
<<actor girlfriend>>
Look at you. Still trying to get hard in there.
You used to think I needed your cock.
I like having you locked much more than I expected.
<</actor>>
<<actor-thought you>>
You twitch inside the cage before you can argue. Her smile widens.
Then she glances at the door, and you know she is waiting for him.
<</actor-thought>>
<<actor girlfriend>>
$bullyName is on his way. I invited him here, and this is not another study excuse.
He's going to fuck me in <em>our</em> bed while you sit in that chair and watch.
If you cry, I won't stop you. I already know you're going to get hard in the cage while you watch.
Sit where I put you and keep your eyes open.
<</actor>>
<img class="delayed centered" @src="setup.genreGifPrefer('hardcuck', 'bbc')" alt="">
<p class="delayed">The door opens. You smell his cologne before he steps into the room and says her name.</p>
<img class="hero-img centered delayed" @src="setup.ImagePath+'story/late/ultimate-he-arrives.jpg'" alt="he arrives">
<<actor bully>>
There he is. The locked boyfriend.
Nah, stay down. Looks like she already found you a seat.
<</actor>>
<<actor girlfriend>>
Show him the cage, baby. Keep your hands out of the way.
He already knows. I sent a photo. But I want him to hear the metal when you breathe.
<</actor>>
<<if $cageAcceptance eq "eager">>
<<actor bully>>
She said you asked for the lock. Hungry little volunteer.
<</actor>>
<<elseif $cageAcceptance eq "forced">>
<<actor bully>>
She said you fought her on it. Guess she got her way.
<</actor>>
<<elseif $flags.keptQuietSmell>>
<<actor girlfriend>>
He still likes pretending. Watch his face when you're inside me.
<</actor>>
<</if>>
<span id="conv"></span>
<div id="options">
<<identity-choice devotion "Pull your waistband down. Present the lock.">>
<<actor bully>>
Damn. She really locked you up.
Wild. Kind of impressive, honestly.
<</actor>>
<<actor girlfriend>>
Say it out loud. What is that?
<</actor>>
<<actor you>>
…My cage. Your... her... keyholder lock. I don't get to fuck. /* prose-ok: distressed speech */
<</actor>>
<<actor girlfriend>>
You left him out. Say what he gets to do.
<</actor>>
<<actor you>>
My cock is locked for you while he fucks you, and I watch without cumming.
<</actor>>
<<run setup.applyIdentity("owned-ultimate-present")>>
<<run setup.peakArousal()>>
<div class="delayed">[[They start without asking you again|Ultimate humiliation sex]]</div>
<</identity-choice>>
<<you-choice "Stop. This is too much.">>
<<actor girlfriend>>
Hold on, he said stop.
$bullyName, get dressed. This does not continue because his body reacted.
<</actor>>
<<actor bully>>
Fine, your relationship, your problem.
<</actor>>
<p class="delayed">He reaches for his clothes. $girlfriendName keeps the key in sight and waits for you to decide whether stopping the scene also ends the relationship.</p>
<div class="delayed continue-links">
<<link "Confirm: unlock me and end the relationship" "End ultimate breakup">><<set $flags.ultimateBreakupDone = true>><<set $caged = false>><<set $strokeState = "free">><<set $relationshipState = "broken-up">><<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>><</link>>
<<link "End tonight. We talk tomorrow." "Home">><<set $flags.noAlphaBoundary = true>><<set $flags.noAlphaBoundaryOrigin = "ultimate-stop">><<set $flags.noAlphaRelationshipDone = false>><<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>><</link>>
</div>
<</you-choice>>
<<identity-choice resistance "Whisper: Please… let me unlock. Just for tonight.">>
<<actor girlfriend>>
No. You can beg while you sit down.
The key stays with me until he is done.
You stay locked, jealous, and quiet unless I ask you something.
<</actor>>
<<actor bully>>
You heard her. Quit asking.
<</actor>>
<<run setup.applyIdentity("owned-ultimate-unlock")>>
<<run setup.peakArousal()>>
<div class="delayed">[[You stay locked. They don't|Ultimate humiliation sex]]</div>
<</identity-choice>>
</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img centered porn-frame" @src="setup.ImagePath+'cuckold/ultimate-chair-pov.jpg'" alt="chair in the corner">
<img class="delayed centered porn-frame" @src="setup.genreGifPrefer('bbc', 'hardcuck')" alt="">
<p class="delayed">From the chair you see her take him into her mouth. Your hands stay on your knees while the bed creaks under them. When she says his name, your fingers dig into your jeans.</p>
<<actor girlfriend>>
God... yes, just like that.
$youName, eyes open. Don't you dare look at the wall.
This is what a cock looks like when it's invited.
Yours is jewelry. His is the point.
<</actor>>
<<actor bully>>
Tell him what you feel.
<</actor>>
<<actor girlfriend>>
I feel so full. Look at your locked clitty twitching for us.
Come here, baby... closer. You can smell <em>him</em> on me.
If you're good, maybe I let you clean me later. Mouth only. The key stays on my neck.
<</actor>>
<<actor-thought you>>
The cage jerks against your pants until the metal hurts. You can hear it clink under the wet slap of their bodies.
You hate how hard the denial makes you, and you hate the way she checks your lap because she knows.
<</actor-thought>>
<<actor girlfriend>>
You can rub the cage if you need to. It won't give you enough friction to finish, and I want you frustrated while you watch.
When he finishes, you're going to thank him for fucking your girlfriend.
Then you're going to thank me for locking you so you couldn't ruin it with that useless little thing.
<</actor>>
<img class="delayed centered" @src="setup.ImagePath+'gf-you/lockup.webp'" alt="">
<span id="conv"></span>
<div id="options">
<<identity-choice devotion "Thank you for fucking her. Thank you for locking me.">>
<<set $flags.ultimateHumiliationDone = true>>
<<actor bully>>
Damn, you actually thanked me.
<</actor>>
<<actor girlfriend>>
Kneel. Tongue out. If you want to clean me, do it without making a scene.
<</actor>>
<<run setup.applyIdentity("owned-ultimate-thank")>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<run setup.peakArousal()>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 2)>>
<div class="delayed">[[Serve what you weren't allowed to give|Caged service]]</div>
<</identity-choice>>
<<you-choice "Stay silent. Shake. Stare at the lock.">>
<<set $flags.ultimateHumiliationDone = true>>
<<actor girlfriend>>
You can stay quiet. I know what that shaking means.
Go to bed with it on and leave it alone.
Tomorrow you'll still be locked, and you'll still be mine.
<</actor>>
<<run setup.peakArousal()>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 2)>>
<div class="delayed">[[Home aching, owned|Home]]</div>
<</you-choice>>
<<identity-choice resistance "I… I can't do this.">>
<<actor girlfriend>>
That's enough. $bullyName, get off the bed now.
I heard him. Being hard does not change what he said.
<</actor>>
<<actor bully>>
All right. I'm leaving.
<</actor>>
<<run setup.applyIdentity("owned-ultimate-refuse")>>
<p class="delayed">The room goes quiet except for clothes being pulled on. $girlfriendName takes the key from her neck. She waits for your decision instead of making another one for you.</p>
<div class="delayed continue-links">
<<link "Confirm: unlock me and end the relationship" "End ultimate breakup">><<set $flags.ultimateBreakupDone = true>><<set $caged = false>><<set $strokeState = "free">><<set $relationshipState = "broken-up">><<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>><</link>>
<<link "End tonight. We talk tomorrow." "Home">><<set $flags.noAlphaBoundary = true>><<set $flags.noAlphaBoundaryOrigin = "ultimate-stop">><<set $flags.noAlphaRelationshipDone = false>><<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>><</link>>
</div>
<</identity-choice>>
</div>
</div>
/* === Act III: Morning after and permanent owned rules === */
<</nobr>><<nobr>>
<<set $storyBeat = "owned-morning-after">>
<<set $storyAct = 3>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/morning-after-rules.jpg'" alt="morning after">
<img class="hero-img centered delayed porn-frame" @src="setup.ImagePath+'cuckold/night-out-return.jpg'" alt="sheets still wrong">
<p class="delayed">Morning comes with his smell still in the sheets. $girlfriendName sits on the edge of the mattress with coffee, the key resting against her collarbone.</p>
<<actor girlfriend>>
About last night. You sat where I told you, watched everything, and left the cage alone.
I know it was a lot, but I'm going to invite him again.
<</actor>>
<<actor-thought you>>
You start to ask how long this lasts, but the key against her chest already gives you the answer.
<</actor-thought>>
<<actor girlfriend>>
I have a few new rules. Listen, then say them back.
Fridays can be $bullyName, $exfriendName, both of them, or me and $bestfriendName. You stay home unless I tell you otherwise.
You clean me when I tell you, and you do it with your mouth. Begging for the key will make me keep it longer.
You can still call me your girlfriend. I decide who gets inside me.
Do you understand?
<</actor>>
<<if $flags.phoneUnlocked>>
<<actor bestfriend>>
(text) morning after. hows the chair boy
she already told me. 💅
<</actor>>
<<else>>
<p class="delayed">$bestfriendName already knows. You can feel it without a text.</p>
<</if>>
<span id="conv"></span>
<div id="options">
<<identity-choice devotion "Yes keyholder. I understand.">>
<<set $flags.ownedMorningAfterDone = true>>
<<actor girlfriend>>
Kiss the key instead of me this morning.
Friday is coming either way.
<</actor>>
<<run setup.applyIdentity("owned-permanent-accept")>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<run setup.peakArousal()>>
<div class="delayed">[[Back to owned life|Home]]</div>
<</identity-choice>>
<<you-choice "I need time. This is a lot.">>
<<set $flags.ownedMorningAfterDone = true>>
<<actor girlfriend>>
You had all night to think about it.
Take the day if you need it. The rules still apply.
<</actor>>
<<set $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1)>>
<<run setup.nudgeArousal(12)>>
<div class="delayed">[[Home with a heavier cage|Home]]</div>
<</you-choice>>
<<identity-choice resistance "Whisper: Can Fridays at least be only him, not the ex?">>
<<set $flags.ownedMorningAfterDone = true>>
<<actor girlfriend>>
No, baby. You don't get to choose which man I see.
$bullyName and $exfriendName can both have Fridays if I want them.
<</actor>>
<<run setup.applyIdentity("owned-permanent-limit")>>
<<run setup.peakArousal()>>
<div class="delayed">[[Accept the calendar|Home]]</div>
<</identity-choice>>
</div>
</div>
<</nobr>><<nobr>>
<<run setup.startEdgeTask()>>
<<set _task = $edgeTask>>
<div class="scene-panel compact">
<<print setup.mediaHTML(setup.edgeTaskMedia(), "hero-img porn-frame delayed")>>
<<if $flags.ultimateHumiliationDone>>
<<actor girlfriend>>
Homework, locked boy. After last night, you don't get an easy task.
Open it, stay sealed, and give me an honest report.
<</actor>>
<<else>>
<<actor girlfriend>>
I have a keyholder task for you, so don't make me wait.
Keep looking while you ache, and don't unlock or finish.
<</actor>>
<</if>>
<p class="scene-lead"><strong><<= _task.title>></strong>, <<= _task.blurb>></p>
<<actor-thought you>>
You're already warm inside the cage, and the image makes the pressure worse. She'll know if you flinch.
<</actor-thought>>
<p class="hint-line">Caged Bird · pass 8 key rings · one strike is recoverable · Streak: <<= $edgeStreak>> (best <<= $edgeBest>>)</p>
<span id="conv"></span>
<div id="options">
<<you-choice "I'll open Caged Bird and follow your rules.">>
<<actor girlfriend>>Eight rings. One strike is forgivable if you report it honestly. Two strikes end the run. You get one retry.<</actor>>
<div class="delayed">[[Start Caged Bird|Edge report game]]</div>
<</you-choice>>
<<you-choice "I can't do this today.">>
<<actor girlfriend>>
Then admit it to me. Send "I chickened," and stay locked while you calm down.
<</actor>>
<<run setup.declineEdgeReport()>>
<div class="delayed">[[Close the chat burning|Edge report result]]</div>
<</you-choice>>
</div>
</div>
<</nobr>><<nobr>>
<<if !$edgeTask>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/act2/cage-lock-ready.jpg'" alt="the keyholder's lock waiting through the report">
<p class="scene-lead">$girlfriendName has not assigned today's report yet.</p>
<div class="continue-links">[[Return to Tasks|Phone tasks]]</div>
</div>
<<else>>
<div class="scene-panel caged-bird-panel">
<img class="hero-img centered caged-bird-story-still" @src="setup.ImagePath+'story/act2/cage-lock-ready.jpg'" alt="the locked cage ready for the keyholder's arcade report">
<h2 class="scene-title">Caged Bird</h2>
<p class="scene-lead"><strong><<= $edgeTask.title>></strong>. Keep the lock airborne and guide it through eight key rings.</p>
<div class="caged-bird-hud" aria-live="polite">
<span id="caged-bird-status">Ready · Rings 0/8 · Strikes 0/2</span>
<span id="caged-bird-retry-status">Retry <<= $edgeBirdRetries>>/1</span>
</div>
<div class="caged-bird-stage">
<canvas id="caged-bird-canvas" width="720" height="380" role="img" aria-label="Caged Bird arcade game. Pass eight key rings and avoid two strikes."></canvas>
</div>
<div class="caged-bird-controls">
<button id="caged-bird-flap" type="button">Flap</button>
<button id="caged-bird-retry" type="button" hidden>Retry once</button>
<button id="caged-bird-continue" type="button" hidden>Send the report</button>
</div>
<p class="hint-line">Touch the game, press <strong>Flap</strong>, or use Space / ↑. One collision is allowed if you report it honestly.</p>
</div>
<<run setTimeout(function () { setup.mountCagedBird(); }, 0)>>
<</if>>
<</nobr>><<nobr>>
<<set _edgeState = setup.ensureEdgeReportState()>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/act2/cage-lock-ready.jpg'" alt="the keyholder's lock waiting for an honest report">
<h2 class="scene-title">Truth check</h2>
<<if !_edgeState>>
<p class="scene-lead">There is no recorded run to report.</p>
<div class="continue-links">[[Return to Tasks|Phone tasks]]</div>
<<elseif _edgeState.settled>>
<p class="scene-lead">$girlfriendName already recorded this report. Its result cannot be submitted twice.</p>
<div class="continue-links">[[Review her verdict|Edge report result]]</div>
<<elseif _edgeState.phase eq "correction">>
<p class="scene-lead">Your first answer did not match the recorded run.</p>
<div class="continue-links">[[Give the one correction|Edge report correction]]</div>
<<else>>
<<actor girlfriend>>I saw the run. Tell me what happened anyway. Rings, strikes, and whether you completed it. One line.<</actor>>
<p class="hint-line">Your recorded run: <<= $edgeBirdScore>> rings · <<= $edgeBirdHits>> strike<<if $edgeBirdHits neq 1>>s<</if>> · <<if $edgeBirdWon>>complete<<else>>failed<</if>></p>
<span id="conv"></span>
<div id="options">
<<if $edgeBirdWon>>
<<you-choice "I passed all eight, and I am reporting every strike.">>
<<run _truth = setup.answerEdgeTruth(true)>>
<<actor girlfriend>><<if $edgeBirdHits eq 0>>Clean run and a clean report. That earns something.<</if>><<if $edgeBirdHits eq 1>>One mistake, admitted without making me drag it out of you. Fair enough.<</if>><</actor>>
<div class="delayed">[[Receive her verdict|Edge report result]]</div>
<</you-choice>>
<<you-choice '"Perfect run. No strikes."'>>
<<run _truth = setup.answerEdgeTruth($edgeBirdHits === 0)>>
<<if _truth eq "correct">><<actor girlfriend>>No. I counted the collision. You get one chance to correct that report.<</actor>><div class="delayed">[[Correct the report|Edge report correction]]</div><<else>><<actor girlfriend>>That matches what I saw.<</actor>><div class="delayed">[[Receive her verdict|Edge report result]]</div><</if>>
<</you-choice>>
<<you-choice '"I failed before eight."'>>
<<run _truth = setup.answerEdgeTruth(false)>>
<<actor girlfriend>>You did not fail. Do not turn a completed run into another kind of lie. Correct it.<</actor>>
<div class="delayed">[[Correct the report|Edge report correction]]</div>
<</you-choice>>
<<else>>
<<you-choice "I failed before eight. Two strikes.">>
<<run _truth = setup.answerEdgeTruth(true)>>
<<actor girlfriend>>Honest, but incomplete. No reward Snap today. Stay locked and try again next report.<</actor>>
<div class="delayed">[[Receive her verdict|Edge report result]]</div>
<</you-choice>>
<<you-choice '"I passed all eight."'>>
<<run _truth = setup.answerEdgeTruth(false)>>
<<actor girlfriend>>The score is still on my screen. Correct the lie before you make it worse.<</actor>>
<div class="delayed">[[Correct the report|Edge report correction]]</div>
<</you-choice>>
<<you-choice '"The game glitched, so it should count."'>>
<<run _truth = setup.answerEdgeTruth(false)>>
<<actor girlfriend>>Blaming the game is still a false report. You get one correction.<</actor>>
<div class="delayed">[[Correct the report|Edge report correction]]</div>
<</you-choice>>
<</if>>
</div>
<</if>>
</div>
<</nobr>><<nobr>>
<<set _edgeState = setup.ensureEdgeReportState()>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/act2/cage-lock-ready.jpg'" alt="the keyholder's lock waiting for the corrected report">
<h2 class="scene-title">One correction</h2>
<<if !_edgeState>>
<p class="scene-lead">There is no recorded run to correct.</p>
<div class="continue-links">[[Return to Tasks|Phone tasks]]</div>
<<elseif _edgeState.settled>>
<p class="scene-lead">The report is already closed. Reloading it cannot change the result.</p>
<div class="continue-links">[[Review her verdict|Edge report result]]</div>
<<else>>
<<actor girlfriend>>Last chance. Give me the result that is actually on my screen.<</actor>>
<p class="hint-line"><<= $edgeBirdScore>> rings · <<= $edgeBirdHits>> strike<<if $edgeBirdHits neq 1>>s<</if>> · <<if $edgeBirdWon>>complete<<else>>failed<</if>></p>
<span id="conv"></span>
<div id="options">
<<you-choice "The result on your screen is the real one.">>
<<run _truth = setup.answerEdgeTruth(true)>>
<<if $edgeBirdWon>><<actor girlfriend>>Better. The run counts, but remember how quickly I caught you.<</actor>><<else>><<actor girlfriend>>Now it is honest. It still was not a win.<</actor>><</if>>
<div class="delayed">[[Receive her verdict|Edge report result]]</div>
<</you-choice>>
<<you-choice "My first report stands.">>
<<run _truth = setup.answerEdgeTruth(false)>>
<<actor girlfriend>>Two lies while I am looking at the score. You get nothing from me today, and I will remember why.<</actor>>
<div class="delayed">[[Receive her verdict|Edge report result]]</div>
<</you-choice>>
</div>
<</if>>
</div>
<</nobr>><<nobr>>
<<set _task = $edgeTask>>
<div class="scene-panel compact">
<img class="hero-img centered delayed" @src="setup.ImagePath+'story/act2/cage-lock-ready.jpg'" alt="the keyholder's lock waiting through the report">
<<actor girlfriend>>
Be honest with me. How bad is it right now, from one to ten? Give me one line, not an essay.
<</actor>>
<p class="hint-line">Heat: <<= $edgeHeat>> / 3 · Task: <<= _task.title>></p>
<span id="conv"></span>
<div id="options">
<<you-choice "It's throbbing. I hate that I need this.">>
<<actor girlfriend>>
Good. I like when you admit that you hate needing this. Keep going.
<</actor>>
<<set $edgeHeat += 1>>
<<set $aroused = $aroused gte 95 ? 100 : $aroused + 20>>
<div class="delayed">[[Final phrase|Edge report step 3]]</div>
<</you-choice>>
<<you-choice "I'm fine. Barely notice it.">>
<<actor girlfriend>>
Liar. The photo is still open. Your face is red. Try again in your head... then type the phrase anyway.
<</actor>>
<<set $edgeHeat += 1>>
<<run setup.nudgeArousal(10)>>
<div class="delayed">[[She doesn't buy it|Edge report step 3]]</div>
<</you-choice>>
<<you-choice "Please unlock. Just for a minute.">>
<<actor girlfriend>>
That's not a report. That's a tantrum.
You aren't getting the key just because you asked. Type the phrase next.
<</actor>>
<<set $edgeHeat += 1>>
<<run setup.peakArousal()>>
<div class="delayed">[[Denied. Continue.|Edge report step 3]]</div>
<</you-choice>>
</div>
</div>
<</nobr>><<nobr>>
<<set _task = $edgeTask>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/act2/cage-lock-ready.jpg'" alt="keyholder locked">
<<actor girlfriend>>
One last thing. Type this exactly, or as close as your shaky thumbs allow:
<em>"<<= _task.phrase>>"</em>
Then you can close the chat, but you stay locked and you stay mine.
<</actor>>
<p class="hint-line">Heat: <<= $edgeHeat>> / 3</p>
<span id="conv"></span>
<div id="options">
<<you-choice "Type her phrase exactly. Mean it.">>
<<actor you>>
<<= _task.phrase>>
<</actor>>
<<actor girlfriend>>
<<if $edgeHeat gte 2>>
I saved that screenshot. Good boy, you really let it get to you this time. I might even be a little proud.
<<else>>
I saved the screenshot. You held back, but you still did what I asked.
<</if>>
<</actor>>
<<run setup.finishEdgeReport("obey")>>
<div class="delayed">[[Send report|Edge report result]]</div>
<</you-choice>>
<<you-choice "Type a half-hearted version / sarcastic spin">>
<<actor girlfriend>>
Cute attitude. You broke your run, and now you can stay locked and frustrated until you learn not to be sarcastic with me.
<</actor>>
<<run setup.finishEdgeReport("resist")>>
<div class="delayed">[[She reacts|Edge report result]]</div>
<</you-choice>>
<<you-choice "Close the app without typing">>
<<actor girlfriend>>
I saw you close it, chicken. I'll remember that when I choose your next task.
<</actor>>
<<run setup.finishEdgeReport("fail")>>
<div class="delayed">[[Burn in silence|Edge report result]]</div>
<</you-choice>>
</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<p class="hint-line">Heat: <<= $edgeHeat>> / 3 · Streak: <<= $edgeStreak>> (best <<= $edgeBest>>)</p>
<<set _edgeState = setup.ensureEdgeReportState()>>
<<if _edgeState && _edgeState.declined>>
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/caged-waiting.jpg'" alt="still locked after declining the report">
<<actor girlfriend>>You admitted you could not face it today. That is better than faking a run, but it does not earn a reward.<</actor>>
<<elseif $edgeStreak gt 0 && $edgeHeat gte 2>>
<img class="hero-img centered" @src="setup.ImagePath+'gf-you/lockup.webp'" alt="">
<<if $girlfriendTrustLevel gte 7>>
<<actor girlfriend>><<if _edgeState && _edgeState.retries gt 0>>You needed the second run, then told me exactly what happened. Good recovery.<br><</if>>That's the kind of report I wanted, good boy. Stay sealed, and maybe I'll let you use your mouth later. Your cock gets nothing.<</actor>>
<<elseif $girlfriendTrustLevel lte 4>>
<<actor girlfriend>>
You did what I asked, so don't get cocky. That was the minimum, and I'm not impressed yet.
<</actor>>
<<else>>
<<actor girlfriend>>
I got your report. Stay sealed, and maybe I'll use your mouth later, but your cock gets nothing. Be ready for the next report.
<</actor>>
<</if>>
<<actor-thought you>>
She has denied you again, and the worst part is that you already want her to send the next task.
<</actor-thought>>
<<elseif $edgeStreak gt 0>>
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/caged-waiting.jpg'" alt="still locked">
<<actor girlfriend>>
You made it through, but you held back. Look longer next time and let yourself feel it.
<</actor>>
<<else>>
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/caged-waiting.jpg'" alt="still locked">
<<if $girlfriendTrustLevel lte 4>>
<<actor girlfriend>>
You ruined the run, and you're testing my patience too. Stay locked and fix your attitude.
<</actor>>
<<else>>
<<actor girlfriend>>
You broke your run, so the cage stays on. Try to sleep with that ache if you can.
<</actor>>
<</if>>
<<if $flags.ultimateHumiliationDone>>
<<actor girlfriend>>
After what you watched in our bed, this should have been easy for you. Don't flinch next time.
<</actor>>
<</if>>
<</if>>
/* Caption story: permanent route-aware Snap reward on pass */
<<if $edgeCaptionReward && $edgeCaptionReward.id>>
<<actor girlfriend>>
(text) I sent you a reward Snap: <<= $edgeCaptionReward.title>>. Open it when you're ready; I'll let you keep the good ones in your gallery. 📸
<</actor>>
<div class="edge-snap-reward">
<p class="edge-snap-reward-label">👻 New Snap · part <<= $edgeCaptionReward.progress>> / <<= $edgeCaptionReward.total>></p>
<div class="edge-snap-reward-cta">
[[Open Snap|Phone snap]]
</div>
</div>
<<elseif $edgeCaptionReward && $edgeCaptionReward.complete>>
<<actor girlfriend>>
(text) You earned the whole set, good boy. Keep sending reports, because I still like watching you ache. 😘
<</actor>>
<p class="hint-line">Caption story complete · <<= setup.captionStoryProgressLabel()>></p>
<</if>>
<p class="hint-line"><<= setup.roleLabel().text>> · GF favor <<= $girlfriendTrustLevel>> · Arousal <<= $aroused>> · Personality <<= setup.personality()>></p>
<div class="continue-links">
[[Tasks|Phone tasks]]
[[Home screen|Phone]]
[[Home]]
<<if $caged && $edgeHeat gte 2 && random(1, 3) eq 1>>[[Beg to serve (mouth only)|Caged service]]<</if>>
</div>
</div>
<</nobr>><<nobr>>
<<set _youRank = setup.getPlayerClassRank()>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/keyholder-presentation-lace-notat.jpg'" alt="Jenny in lace before the printed ranking">
<p class="delayed">At home, $girlfriendName drops the printed ranking on the dresser and closes the bedroom door. She peels off the blouse and stands in the lace she made you pay for, studying your face while your locked clitty nudges your pants.</p>
<<actor girlfriend>>
<<if $flags.ownedPublicRoleAccepted>>
You accepted the result in front of everyone. I saw you choose that.
My commendation is mine. Your field correction is yours. $bestfriendName's private slide was neither, and I am dealing with her.
<<else>>
You called the final list a joke in front of everyone.
I'm still angry about $bestfriendName's slide, but I noticed you finally used a full voice. The council label can stay on paper. My rules are the part we settle here.
<</if>>
<</actor>>
<<actor-thought you>>
The school result lies face down beside the chair where you watched $bullyName fuck her. Your clitty throbs inside the cage, but $girlfriendName is already talking about tonight instead of reading the result again.
<</actor-thought>>
<<actor girlfriend>>
New rule for Fridays: You set the room up before I go out.
Towels by the bed, drinks ready, and the chair wherever I point.
Tonight I want it facing the sheets. $bullyName and $exfriendName saw the list, and they both want to congratulate my support boy.
You use your mouth and clean whatever I tell you to clean. You already know who gets my pussy.
<</actor>>
<span id="conv"></span>
<div id="options">
<<identity-choice devotion "Yes, keyholder. I'll prepare the room.">>
<<set $flags.keyholderPresentationDebriefDone = true>>
<<run setup.applyIdentity("final-debrief-accept")>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<actor girlfriend>>
Center the chair, put the ranking on the screen, and leave the cage alone.
<</actor>>
<div class="delayed">[[Back to Home|Home]]</div>
<</identity-choice>>
<<you-choice "Both of them? Here? Tonight?">>
<<set $flags.keyholderPresentationDebriefDone = true>>
<<run setup.nudgeArousal(14)>>
<<actor girlfriend>>
Yes, both of them, here tonight. Set the chair and stop asking the same question.
<</actor>>
<div class="delayed">[[Try to breathe at Home|Home]]</div>
<</you-choice>>
<<identity-choice devotion "Kiss the key under your printed rank.">>
<<set $flags.keyholderPresentationDebriefDone = true>>
<<run setup.applyIdentity("final-debrief-kiss")>>
<<run setup.peakArousal()>>
<<actor girlfriend>>
There you go, kissing my key while the school paper sits over there.
You make this too easy sometimes.
<</actor>>
<div class="delayed">[[Wait for tonight at Home|Home]]</div>
<</identity-choice>>
</div>
</div>
<</nobr>><<nobr>>
<<set $storyBeat = "double-bull-chair">>
<<set _youRank = setup.getPlayerClassRank()>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/double-bull-blank-tv.jpg'" alt="Jenny in black lace beside the waiting chair with the television switched off">
<<if $flags.ownedPublicRoleAccepted>>
<p class="delayed">$girlfriendName changed the bedding to black and switched off the television. The printed school result lies face down beside the key. You accepted it in class; she does not need to make you read it again.</p>
<<else>>
<p class="delayed">$girlfriendName changed the bedding to black and switched off the television. The school result is gone. You rejected the council's label, so tonight she has left only her rules, the chair, and the choice in front of you.</p>
<</if>>
<p class="delayed">An unopened box of condoms sits beside the key on the nightstand. When you ask about it, she smiles and tells you to wait.</p>
<<actor-thought you>>
$girlfriendName is wearing the lace she made you buy, with the key resting between her tits. Two sets of clothes folded on the dresser belong to the men she invited.
Your locked clitty already hurts and nobody has touched the bed yet.
<</actor-thought>>
<<actor bully>>
School project is over. This setup is better.
Get me a drink, locked boyfriend. Then sit the fuck down.
<</actor>>
<<actor exfriend>>
This is weird. I mean him setting everything up for us. Even the condoms.
<</actor>>
<img class="hero-img centered delayed" @src="setup.ImagePath+'story/owned/double-bull-chair-night-notat.jpg'" alt="The keyholder between both adult bulls, one with a buzz cut, with the chair waiting">
<p class="delayed">Your phone buzzes. $bestfriendName is not here, but $girlfriendName sent her one setup photo before the door opened. She turns the school attendance joke into a roll call for the bedroom.</p>
<<actor bestfriend>>
(text) Roll call complete: Everybody showed up tonight. 💀
Two bulls, one keyholder, one locked cleanup boy. 💅
Make him look at the bed when he chooses the chair. No hiding in a school result.
<</actor>>
<<actor girlfriend>>
Stand by the chair, baby. Look at all three of us before you sit.
They both get me tonight. You get the chair, then you clean up.
<</actor>>
<span id="conv"></span>
<div id="options">
<<identity-choice devotion "Look at all three of them and take the chair.">>
<<run setup.applyIdentity("final-chair-point")>>
<<run setup.peakArousal()>>
<<actor bully>>
There. He chose it. Now sit down and let us get started.
<</actor>>
<div class="delayed">[[Take the chair|Double bull chair payoff]]</div>
<</identity-choice>>
<<if $flags.ownedPublicRoleAccepted>>
<<you-choice "Ask $girlfriendName to keep the school result out of tonight.">>
<<run setup.nudgeArousal(16)>>
<<actor girlfriend>>
Fine, no council words. Just my room, my key, and the choice in front of you.
Sit down. Now.
<</actor>>
<div class="delayed">[[Sit under the final list|Double bull chair payoff]]</div>
<</you-choice>>
<<else>>
<<you-choice "Tell her this is her choice, not the council's.">>
<<run setup.nudgeArousal(16)>>
<<actor girlfriend>>Exactly. No council words. My room, my key, and my choice. Now sit down.<</actor>>
<div class="delayed">[[Sit for her rules|Double bull chair payoff]]</div>
<</you-choice>>
<</if>>
<<identity-choice devotion "Tell her you are staying to watch.">>
<<run setup.applyIdentity("final-chair-thank")>>
<<run setup.peakArousal()>>
<<actor exfriend>>
He really chose the chair himself.
<</actor>>
<<actor bully>>
Then keep your eyes open, locked boy.
<</actor>>
<div class="delayed">[[Sit and keep your eyes open|Double bull chair payoff]]</div>
<</identity-choice>>
</div>
</div>
<</nobr>><<nobr>>
<<set _youRank = setup.getPlayerClassRank()>>
<div class="scene-panel compact">
<img class="hero-img centered porn-frame" @src="setup.ImagePath+'story/owned/double-bull-chair-payoff-notat.jpg'" alt="The keyholder between both adult bulls, one with a buzz cut, on the black bed">
<img class="delayed centered porn-frame" @src="setup.genreGifPrefer('hardcuck', 'bbc')" alt="">
<p class="delayed">The chair is close enough to smell the bed. $girlfriendName slides the lace off one shoulder and pulls $bullyName down by his belt. $exfriendName's shirt is already open when she grabs him too. Three bodies settle on the black sheets. The key on her chest catches the TV light every time she moves.</p>
<<actor girlfriend>>
Keep your eyes open, baby, and watch.
$bullyName gets my pussy first. $exfriendName already knows what I like after. You get nothing but the view.
<</actor>>
<<actor-thought you>>
$bullyName pushes into her in one long stroke while she gasps into $exfriendName's mouth. From the chair, you can see her thighs shake and his hands tighten on her hips. The key bounces between her tits.
Your clitty strains inside the cage. A wet spot spreads against your thigh, and you cannot reach the ache through the bars.
<</actor-thought>>
<<actor bully>>
Feel that? She's dripping. Tell your keyholder how wet she gets when a real cock is inside her.
<</actor>>
<<actor girlfriend>>
God... Harder, fuck. Not you, baby, him.
Fuck me harder, $bullyName. Let my locked boyfriend hear what a full pussy sounds like.
<</actor>>
<<actor exfriend>>
She used to make that noise for me. Nice to know some things come back.
<</actor>>
<<actor girlfriend>>
$exfriendName, shut up and put it in my mouth.
If I'm gonna be full of cock from both ends, my caged boy better be taking notes.
<</actor>>
<p class="delayed">She takes $exfriendName between her lips while $bullyName drives into her from behind. The room fills with wet sounds, skin on skin, her muffled moans. She lifts her head, just long enough to look at you in the chair.</p>
<img class="delayed centered porn-frame" @src="setup.ImagePath+'story/owned/double-bull-sex-jamal-v2b-notat.jpg'" alt="Jenny naked in Jamal's lap on the bed">
<<actor girlfriend>>
I changed my mind about the condoms, baby. He's going to cum inside me.
And you're going to clean every fucking drop because that is the rule tonight.
Say yes. I want to hear it while he fills me.
<</actor>>
<span id="conv"></span>
<div id="options">
<<identity-choice devotion 'Say it out loud. "Yes, keyholder" while $bullyName finishes inside her.'>>
<<set $flags.doubleBullChairDone = true>>
<<run setup.applyIdentity("final-payoff-say")>>
<<run setup.peakArousal()>>
<<actor you>>
Yes, keyholder.
<</actor>>
<<actor girlfriend>>
Say you understand. I want them to hear you while he finishes inside me.
<</actor>>
<<actor you>>
I understand. I stay in the chair, then I clean you.
<</actor>>
<<actor bully>>
Damn. Clear enough.
<</actor>>
<p class="delayed">$bullyName spills inside her. Then $exfriendName takes his turn, moving more slowly because he knows her body. She comes on his cock with her eyes on the cage. When both are done, she sits back against the pillows with her knees apart and pats the wet sheets.</p>
<img class="delayed centered porn-frame" @src="setup.ImagePath+'story/owned/double-bull-sex-jamal-v2a-notat.jpg'" alt="Jenny on her back with Jamal on top">
<<actor girlfriend>>
Crawl over here with your tongue out. Clean the cock first, then the pussy. Every drop I gave him back.
No hands, mouth only. Earn your place tonight.
<</actor>>
<<actor-thought you>>
You taste his cum on her thighs before you reach her pussy. Her taste follows, then both of them together. She holds your head in place with her fingers in your hair and tells you to keep going.
Your cock leaks inside the cage the whole time. Nobody asks what you feel.
<</actor-thought>>
<img class="delayed centered porn-frame" @src="setup.ImagePath+'story/owned/double-bull-cleanup-naked-notat-s42.jpg'" alt="aftermath from the chair">
<div class="delayed">[[Clean up and return Home|Home]]</div>
<</identity-choice>>
<<you-choice "Stay silent. Hold the steel until it hurts. Don't look away.">>
<<set $flags.doubleBullChairDone = true>>
<<run setup.peakArousal()>>
<<actor girlfriend>>
I said to say it.
...Fine. Silent support is still support, but you're cleaning up either way. Tongue or tears, your pick.
<</actor>>
<p class="delayed">$bullyName finishes inside her. $exfriendName takes his turn. She keeps her eyes on the chair the whole time, watching you watch her get fucked and filled. When both pull out, the bed is wet. The key taps your chin as she pulls you forward.</p>
<<actor girlfriend>>
Open your mouth. Don't make me pry your jaw loose.
There you go. Swallow what the men in my bed left.
Don't worry. $bestfriendName will make you use your voice next time.
<</actor>>
<img class="delayed centered porn-frame" @src="setup.ImagePath+'story/owned/double-bull-cleanup-naked-notat-s42.jpg'" alt="aftermath from the chair">
<div class="delayed">[[Survive the rest of the night|Home]]</div>
<</you-choice>>
<<identity-choice devotion "Thank both of them. Let $girlfriendName watch you beg.">>
<<set $flags.doubleBullChairDone = true>>
<<run setup.applyIdentity("final-payoff-thank")>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<run setup.peakArousal()>>
<<actor you>>
Thank you both for fucking her and letting me watch.
<</actor>>
<<actor bully>>
He thanked us without her asking. Damn, locked boy.
<</actor>>
<<actor girlfriend>>
Look at you thanking them before I even asked. Stay on your knees.
Now crawl here and clean. Cock first. Taste what she felt.
<</actor>>
<p class="delayed">$bullyName and $exfriendName take turns inside her while you kneel and thank each one when they finish. Then your tongue finds her, dripping, thighs shaking. She rides your face until the cum is gone and her own orgasm leaves her breathless.</p>
<img class="delayed centered porn-frame" @src="setup.ImagePath+'story/owned/double-bull-cleanup-naked-notat-s42.jpg'" alt="aftermath from the chair">
<div class="delayed">[[Return to owned life|Home]]</div>
<</identity-choice>>
</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/friday-alessia-club.jpg'" alt="Alessia at the club planning next Friday">
<p class="scene-lead">The next morning, Snap opens on $bestfriendName alone under violet club lights. No $girlfriendName in frame. Just that smile.</p>
<<actor bestfriend>>
(snap) Good news, support boy.
$girlfriendName says I can borrow you next Friday.
I'm not borrowing the key, so relax. Your clitty stays locked, but your wallet, your errands, and that embarrassing little "yes ma'am" voice are mine. 💅
The club has a dress code. You don't meet it yet.
Maybe I make you change in the bathroom while I watch. See if the cage clinks. 💀
<</actor>>
<<actor girlfriend>>
(text) Be nice to her. Actually, don't. She likes you nervous. 😘
<</actor>>
<<actor-thought you>>
You read the message twice. Your stomach drops when you picture what $bestfriendName means by the dress code.
<</actor-thought>>
<div class="continue-links delayed">
<<link "Save the snap. Face next Friday.">>
<<set $flags.alessiaSoloTeaseSeen = true>>
<<set $storyBeat = "alessia-friday-tease">>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<goto "Home">>
<</link>>
</div>
</div>
<</nobr>><<nobr>>
<<if !setup.fridayDateReady()>>
<div class="scene-panel compact"><p class="scene-lead">No Friday date lined up right now.</p><div class="continue-links">[[Home]]</div></div>
<<elseif !setup.canPayFridayDate()>>
<<include "Friday date broke">>
<<else>>
<<set _fdCost = setup.fridayDateCost()>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/friday-gf-date.jpg'" alt="Friday night weight">
<p class="scene-lead">All Friday afternoon, you keep checking the time. Her plans start after dark.</p>
<p class="hint-line">Tonight's bill (you pay): <strong>$<<= _fdCost >></strong> · wallet <strong>$<<= $money >></strong></p>
<<if $gameDate.getHours() gte 17>>
<div class="continue-links">
<<link `"It's evening, go · $" + _fdCost` setup.fridayDatePassage()>><</link>>
[[Home]]
</div>
<<else>>
<p class="hint-line">It is too early. Find something to do until evening, and bring enough cash.</p>
<div class="continue-links">
[[Wait until evening|Wait until evening]]
[[Home]]
</div>
<</if>>
</div>
<</if>>
<</nobr>><<nobr>>
<<set _fdCost = setup.fridayDateCost()>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/caged-waiting.jpg'" alt="broke on Friday">
<h2 class="scene-title">Broke on Friday</h2>
<p class="scene-lead">You check your wallet again. There still is not enough for the night she planned.</p>
<p class="hint-line">Need <strong>$<<= _fdCost >></strong> · you have <strong>$<<= $money >></strong>.</p>
<<actor girlfriend>>
<<if $caged>>
(text) cute. locked with empty pockets.
go earn it. i want my Friday paid for.
<<else>>
(text) you want Friday with me? bring money.
i don't do broke dates. 😒
<</if>>
<</actor>>
<p class="hint-line">Earn on weekdays or weekends. Come back with enough for her Friday.</p>
<div class="continue-links">
[[Home]]
</div>
</div>
<</nobr>><<nobr>>
<<if !setup.canPayFridayDate("gf")>>
<<include "Friday date broke">>
<<else>>
<<set _fdCost = setup.fridayDateCost("gf")>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/friday-gf-date.jpg'" alt="Friday date with her">
<p class="delayed">On Friday night, $girlfriendName meets you alone. She slips her hand into yours on the walk to dinner.</p>
<p class="hint-line">Date cost: <strong>$<<= _fdCost >></strong> (dinner, drinks, you pay) · wallet $<<= $money >></p>
<<actor girlfriend>>
Okay, a real date. You get me for the evening, and your card gets dinner.
Try not to ruin it by overthinking.
<</actor>>
<<actor-thought you>>
Her hand is warm in yours. You try to enjoy it without wondering how many more Fridays will feel this easy.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "Make the evening about her and walk her home afterward.">>
<<actor girlfriend>>
See? You can be a boyfriend.
This was nice. Do it again next Friday.
<</actor>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<run setup.nudgeArousal(6)>>
<<run setup.completeFridayDate("gf")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Try to get physical too fast.">>
<<actor girlfriend>>
Easy. Dinner first. You still pay for dinner.
...Okay. Kiss. That's enough for public.
<</actor>>
<<run setup.nudgeArousal(8)>>
<<run setup.completeFridayDate("gf")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !setup.canPayFridayDate("keyholder")>>
<<include "Friday date broke">>
<<else>>
<<set _fdCost = setup.fridayDateCost("keyholder")>>
<div class="scene-panel compact">
<img class="hero-img centered porn-frame" @src="setup.ImagePath+'girlfriend/keyholder-key-smile.jpeg'" alt="">
<p class="delayed">For your first Friday date since the lock, she wears the key on a fine chain. It flashes above her dress whenever she leans across the table.</p>
<p class="hint-line">Keyholder dinner: <strong>$<<= _fdCost >></strong> · you pay, she keeps the key · wallet $<<= $money >></p>
<<actor girlfriend>>
Date night, and you're staying locked through dinner.
That should make dessert more interesting for me. Yes, we're using your card.
<</actor>>
<img class="delayed centered porn-frame" @src="setup.ImagePath+'girlfriend/keyholder-bed-sit.jpg'" alt="">
<span id="conv"></span>
<div id="options">
<<you-choice "Hold the door, pay, and save 'keyholder' for when she asks.">>
<<actor girlfriend>>
Good boy.
Be sweet out here. Save the desperate stuff for when we're home.
<</actor>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<run setup.peakArousal()>>
<<run setup.completeFridayDate("keyholder")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Ask if tonight means unlock.">>
<<actor girlfriend>>
Aww, you thought dinner came with an unlock? No.
You get to walk beside me and behave.
<</actor>>
<<run setup.peakArousal()>>
<<run setup.completeFridayDate("keyholder")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !setup.canPayFridayDate("caged_public")>>
<<include "Friday date broke">>
<<else>>
<<set _fdCost = setup.fridayDateCost("caged_public")>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/friday-caged-public.jpg'" alt="caged public date">
<p class="delayed">She chose a quiet restaurant with cloth napkins and low light. Her dress gets a second glance from the waiter. Your cage pinches under your jeans as you sit across from her in the corner booth.</p>
<p class="hint-line">Caged dinner: <strong>$<<= _fdCost >></strong> (you pay, you ache) · wallet $<<= $money >></p>
<<actor girlfriend>>
Tonight we look normal. Hold the door, order for me, and pay.
Then sit across from me knowing what's under the table.
<</actor>>
<<actor-thought you>>
She can call this normal because nobody else can see beneath the table.
The cage is warm after the walk from the car. When she crosses her legs, candlelight glints off the key at her neck.
<</actor-thought>>
<img class="delayed centered" @src="setup.ImagePath+'girlfriend/keyholder-key-smile.jpeg'" alt="">
<span id="conv"></span>
<div id="options">
<<you-choice "Order her wine and steak, and play the attentive boyfriend.">>
<<actor girlfriend>>
See? You can still take me out without talking about your cage all night.
Cute napkin fold. You practiced.
<</actor>>
<p class="delayed">The waiter brings dessert. She leans in. Her lips brush your ear.</p>
<<actor girlfriend>>
You're doing so well. Almost like you forgot.
Then you shifted in the booth and gave yourself away. The cage has been bothering you all night, hasn't it?
<</actor>>
<<actor-thought you>>
You never forgot. Every shift in the booth pressed the cage against you.
Her perfume hangs over the dessert menu, and she gives the waiter an easy smile before turning back to watch you squirm. You pay while she enjoys both the meal and your discomfort.
<</actor-thought>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<run setup.peakArousal()>>
<<run setup.completeFridayDate("caged_public")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Whisper: can we skip dessert and go home?">>
<<actor girlfriend>>
Go home? We just got here, and dessert is the best part.
Obviously not for you. Sit there, finish your food, and smile when you pay.
<</actor>>
<<run setup.peakArousal()>>
<<run setup.completeFridayDate("caged_public")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Reach for her hand under the table. She pulls it to the key.">>
<<actor girlfriend>>
That's not your hand's job tonight.
The key stays where it is. Your hand goes back to the napkin.
Cute try, though.
<</actor>>
<img class="delayed centered" @src="setup.ImagePath+'girlfriend/keyholder-bed-sit.jpg'" alt="">
<<run setup.peakArousal()>>
<<run setup.completeFridayDate("caged_public")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !setup.canPayFridayDate("bull1")>>
<<include "Friday date broke">>
<<else>>
<<set _fdCost = setup.fridayDateCost("bull1")>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/friday-bull-leave.jpg'" alt="she leaves with him">
<p class="delayed">This Friday, she has plans with $bullyName. You have an evening at home and their bill to cover.</p>
<p class="hint-line">Her night with him: <strong>$<<= _fdCost >></strong> (you fund it) · wallet $<<= $money >></p>
<<actor girlfriend>>
I'm going out with him. You stay home with your phone on, and don't stalk us.
Covering the bill is your contribution tonight.
<</actor>>
<<actor-thought you>>
You picture the two of them while she gets ready. By the time she leaves, you are aching and already thinking about the charge on your card.
<</actor-thought>>
<img class="delayed centered" @src="setup.ImagePath+'story/owned/night-out-wait.jpg'" alt="you wait locked">
<span id="conv"></span>
<div id="options">
<<you-choice "Tell your keyholder you will wait up and cover the bill.">>
<img class="delayed centered porn-frame" @src="setup.ImagePath+'cuckold/night-out-return.jpg'" alt="">
<<actor girlfriend>>
I'm late, my hair's a mess, and I smell like his cologne.
You actually stayed up waiting for me. I knew you would.
Kiss the air. You don't get the real one.
<</actor>>
<<run setup.peakArousal()>>
<<run setup.completeFridayDate("bull1")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Beg her not to go.">>
<<actor girlfriend>>
That's not how Fridays work anymore. I'm still going, and you're still paying.
Don't make this more annoying than it needs to be.
<</actor>>
<<set $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1)>>
<<run setup.peakArousal()>>
<img class="delayed centered porn-frame" @src="setup.ImagePath+'cuckold/jenny-kiss-bed.jpeg'" alt="">
<<run setup.completeFridayDate("bull1")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !setup.canPayFridayDate("bull2")>>
<<include "Friday date broke">>
<<else>>
<<set _fdCost = setup.fridayDateCost("bull2")>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/friday-ex-leave.jpg'" alt="Friday with the ex">
<p class="delayed">This Friday she is meeting $exfriendName. He already knows her body, and their history is harder to dismiss than a night with a stranger.</p>
<p class="hint-line">Ex Friday tax: <strong>$<<= _fdCost >></strong> · wallet $<<= $money >></p>
<<actor girlfriend>>
It's not a new guy. I'm seeing $exfriendName.
We have history, and you have a cage and a card.
Same rules: Phone on. No stalking. Don't text, "Are you safe?"
<</actor>>
<<actor bestfriend>>
(text) OMG, the ex is back.
And he already knows how she sounds.
Send me pics or it didn't happen.
(Not to the locked one. To me.) 💅
<</actor>>
<<actor-thought you>>
You remember watching them together in the hallways. Now she leaves to meet him with your cage key around her neck, and you pay for the date.
<</actor-thought>>
<img class="delayed centered" @src="setup.ImagePath+'story/owned/caged-waiting.jpg'" alt="you wait locked">
<<if $flags.phoneUnlocked>>
<p class="delayed hint-line">Your phone buzzes twice, then stays quiet.</p>
<<actor bestfriend>>
(text) Update: They went to that place on 5th, the one you can't afford. 💅
<</actor>>
<<actor girlfriend>>
(text) Don't wait up. Or do. I don't control your bedtime. 😈
<</actor>>
<<actor-thought you>>
They are both out following her night while you sit at home. Each buzz makes you tense painfully against the cage.
<</actor-thought>>
<p class="delayed hint-line">An hour later, she sends a photo.</p>
<<actor girlfriend>>
(photo) Mirror pic. You can see the key, and my wrist still smells like his cologne.
Caption: History hits different when the current BF is sealed. 😘
<</actor>>
<<actor bestfriend>>
(text) SHE SENT ME THE MIRROR PIC
The AUDACITY. Also the lighting. 💀💅
<</actor>>
<<actor-thought you>>
The mirror catches the key at her throat and the wrist she says smells like him. You zoom in, put the phone down, then pick it up again a minute later.
Nothing in the photo has changed, and neither has the pressure under your jeans.
<</actor-thought>>
<</if>>
<span id="conv"></span>
<div id="options">
<<you-choice "Stay home and clean while you wait for her.">>
<img class="delayed centered" @src="setup.ImagePath+'story/owned/friday-ex-return.jpg'" alt="she comes back late">
<<actor girlfriend>>
Home smells like bleach and denial when I get back.
Being with him felt familiar, and you're still locked. Sounds like a good Friday to me.
<</actor>>
<<actor-thought you>>
She walks in at one in the morning with tangled hair, smeared lipstick, and his cologne on her collar.
She makes no effort to hide any of it. You cleaned while she was out, and now you wait outside the bathroom while the shower runs.
<</actor-thought>>
<<if $flags.phoneUnlocked>>
<<actor bestfriend>>
(text) Post-Friday report.
He brought her flowers. She brought you laundry.
Your move, chair boy. 💅
<</actor>>
<</if>>
<<run setup.peakArousal()>>
<<run setup.completeFridayDate("bull2")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Ask if $bullyName knows.">>
<img class="delayed centered" @src="setup.ImagePath+'story/owned/friday-ex-return.jpg'" alt="she comes back late">
<<actor girlfriend>>
Maybe he knows, and maybe he likes the competition. $exfriendName already does.
Either way, it's not your department.
<</actor>>
<<actor-thought you>>
She draws out "maybe" while she removes an earring and smiles at your confusion.
$bullyName and $bestfriendName already know. By now, the group chat probably does too, and nobody thought you needed to be told.
<</actor-thought>>
<<actor bestfriend>>
(text) He knows.
She told him for fun.
Sit down. 💅
<</actor>>
<<run setup.peakArousal()>>
<<run setup.completeFridayDate("bull2")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !setup.canPayFridayDate("both")>>
<<include "Friday date broke">>
<<else>>
<<set _fdCost = setup.fridayDateCost("both")>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/friday-both-leave.jpg'" alt="Friday with both of them">
<p class="delayed">She has booked Friday with both $bullyName and $exfriendName. She tells you while checking the time on her phone, as casually as if they were meeting for drinks.</p>
<p class="hint-line">Double booking bill: <strong>$<<= _fdCost >></strong> · wallet $<<= $money >></p>
<<actor girlfriend>>
Both of them. You heard me, $bullyName and $exfriendName.
You stay home while I go with them, and the charge goes on your card.
If you're very good, chair rights later, not tonight.
<</actor>>
<<actor-thought you>>
You know exactly what each man wants from her. She checks that you are locked, picks up her bag, and leaves you alone in the house after making sure your card works.
<</actor-thought>>
<img class="delayed centered" @src="setup.ImagePath+'story/owned/caged-waiting.jpg'" alt="you wait locked">
<span id="conv"></span>
<div id="options">
<<you-choice "Lock the door after she leaves and wait without calling.">>
<img class="delayed centered porn-frame" @src="setup.ImagePath+'cuckold/jenny-kiss-bed.jpeg'" alt="">
<<actor girlfriend>>
Morning update: Sore, smiling, and still your girlfriend.
Fridays are a little crowded now.
<</actor>>
<<run setup.peakArousal()>>
<<run setup.completeFridayDate("both")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Ask to watch.">>
<<actor girlfriend>>
You're greedy.
Not this Friday. Maybe another night, if you learn to wait without whining. You still paid for this one.
<</actor>>
<<run setup.peakArousal()>>
<<run setup.completeFridayDate("both")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !setup.canPayFridayDate("alessia")>>
<<include "Friday date broke">>
<<else>>
<<set _fdCost = setup.fridayDateCost("alessia")>>
<<set _walletCost = _fdCost + 15>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/friday-alessia-night.jpg'" alt="Jenny and Alessia out for the night">
<p class="delayed">$bestfriendName joins her this Friday. They laugh together in the hallway while rain shines on the pavement outside. $girlfriendName checks that you can see the key at her throat before they leave without you.</p>
<p class="hint-line">Girls' night (your wallet): <strong>$<<= _fdCost >></strong> · wallet $<<= $money >></p>
<<actor bestfriend>>
We're going out, and you're not.
Unless $girlfriendName wants a purse with legs. Then maybe you carry, but either way you pay.
<</actor>>
<<actor girlfriend>>
She's mean, and I'm worse when she eggs me on.
Stay home and fund the night. If you're good, we might send a mirror pic.
<</actor>>
<span id="conv"></span>
<div id="options">
<<if setup.canPayFridayDate("alessia", { extra: 15 })>>
<<you-choice "Offer to drive, carry their things, and keep quiet.">>
<<actor bestfriend>>
Wallet boy... I like that. Keep quiet unless one of us talks to you.
<</actor>>
<<actor girlfriend>>
I'm proud that you found a use for yourself. The begging still needs work.
You can have one kiss on the cheek.
<</actor>>
<<run setup.nudgeArousal(10)>>
<<run setup.completeFridayDate("alessia", { extra: 15 })>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> (base + tip) · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<else>>
<p class="hint-line">Wallet-boy offer needs <strong>$<<= _walletCost >></strong>. You only have $<<= $money >>.</p>
<</if>>
<<you-choice "Stay home. Don't ask for crumbs.">>
<<actor girlfriend>>
Smart.
We had fun. Nobody at the club needed to know what you're wearing under those jeans.
And yes, your card worked.
<</actor>>
<<run setup.peakArousal()>>
<<run setup.completeFridayDate("alessia")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !setup.genreHas("vesperina")>>
<div class="scene-panel compact">
<p class="scene-lead">No clip pack installed.</p>
<div class="continue-links">[[Home]]</div>
</div>
<<elseif $flags.goddessPlaylistComplete>>
<div class="scene-panel compact">
<<actor girlfriend>>
You finished the playlist, and I already know which clips got to you most.
<</actor>>
<<if setup.goddessBestClipIndex() neq null>>
<div class="continue-links">[[Rewatch your #1|Goddess homework finale]]</div>
<</if>>
<div class="continue-links">[[Home]][[Tasks|Phone tasks]][[Home screen|Phone]]</div>
</div>
<<elseif !setup.goddessHomeworkReady() && ($flags.goddessLastDayKey || !setup.isJennyClipDay())>>
<div class="scene-panel compact">
<<if setup.isJennyClipDay()>>
<p class="scene-lead">Clip homework is already done for today.</p>
<<else>>
<p class="scene-lead">Clip homework only lands Tuesday and Thursday. Next: <<= setup._nextWeekdayLabel(setup.JENNY_CLIP_WEEKDAYS)>>.</p>
<</if>>
<div class="continue-links">[[Home]][[Tasks|Phone tasks]][[Home screen|Phone]]</div>
</div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/act2/homework-assign.jpg'" alt="clip homework assignment">
<<actor girlfriend>>
I have special homework for you, not a free porn menu. You'll get one new clip with no repeats until you've seen the whole set.
Keep the sound on, watch to the end, and don't cum. Afterward, rate it honestly so I can find out which one wrecks you most.
<</actor>>
<<actor bestfriend>>
(text) Don't skip it. She checks, and I'll laugh when she catches you 😈
<</actor>>
<p class="hint-line">Unwatched left (before this one): <<= setup.goddessClipsLeft()>></p>
<p class="hint-line credit-line">Clip pack shoutout: <strong><<= setup.VESPERINA_CREDIT>></strong>. Some of these homework clips are AI edits built from her work. Support the source if you can.</p>
<div class="continue-links">
[[Open the clip|Goddess homework watch]]
<<link "Open Goddess Vesperina (browser)">><<run setup.openVesperina()>><</link>>
[[Skip (she'll notice)|Goddess homework skip]]
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<p class="scene-lead">Watch the full clip with the sound on, then rate it to complete today's assignment.</p>
<<print setup.vesperinaHTML()>>
<p class="hint-line credit-line">Shoutout: <<= setup.VESPERINA_CREDIT>> · homework clips include AI edits from her content (local files only).</p>
<<actor-thought you>>
She gives you a new clip with every assignment, and when the set is finished, she'll know exactly which one affected you most.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "Watch to the end. Hands off / cage only.">>
<<actor girlfriend>>
Good. Now rate it, and don't lie to me. I can tell when you do.
<</actor>>
<<run setup.finishGoddessHomework("done")>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="delayed">[[Rate the assignment|Goddess homework rate]]</div>
<</you-choice>>
<<you-choice "Mute and half-watch">>
<<actor girlfriend>>
You half-assed it, but you still watched enough to rate it. Go on.
<</actor>>
<<run setup.finishGoddessHomework("done")>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="delayed">[[Rate it|Goddess homework rate]]</div>
<</you-choice>>
<<you-choice "Close before the end">>
<<actor bestfriend>>
(text) chicken 💅
<</actor>>
<<actor girlfriend>>
If you skip it, I'll leave that clip on your list for another day.
<</actor>>
<<run setup.finishGoddessHomework("skip")>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<<if $goddessPendingClip eq null>>
<p class="scene-lead">Nothing to rate.</p>
<div class="continue-links">[[Home]]</div>
<<else>>
<img class="hero-img centered" @src="setup.ImagePath+'story/act2/homework-rate.jpg'" alt="rate the homework">
<<actor girlfriend>>
Tell me how much that clip got to you, and be honest.
<</actor>>
<<actor bestfriend>>
(text) don't lie just to make yourself look less pathetic 😈
<</actor>>
<p class="hint-line">Clip #<<= $goddessPendingClip>> · 1 = meh · 10 = need that forever</p>
<div class="genre-grid goddess-rate-grid">
<<link "1">><<run setup.rateGoddessClip(1)>><<run setup.markGoddessClipWatched()>><<goto "Goddess homework done">><</link>>
<<link "2">><<run setup.rateGoddessClip(2)>><<run setup.markGoddessClipWatched()>><<goto "Goddess homework done">><</link>>
<<link "3">><<run setup.rateGoddessClip(3)>><<run setup.markGoddessClipWatched()>><<goto "Goddess homework done">><</link>>
<<link "4">><<run setup.rateGoddessClip(4)>><<run setup.markGoddessClipWatched()>><<goto "Goddess homework done">><</link>>
<<link "5">><<run setup.rateGoddessClip(5)>><<run setup.markGoddessClipWatched()>><<goto "Goddess homework done">><</link>>
<<link "6">><<run setup.rateGoddessClip(6)>><<run setup.markGoddessClipWatched()>><<goto "Goddess homework done">><</link>>
<<link "7">><<run setup.rateGoddessClip(7)>><<run setup.markGoddessClipWatched()>><<goto "Goddess homework done">><</link>>
<<link "8">><<run setup.rateGoddessClip(8)>><<run setup.markGoddessClipWatched()>><<goto "Goddess homework done">><</link>>
<<link "9">><<run setup.rateGoddessClip(9)>><<run setup.markGoddessClipWatched()>><<goto "Goddess homework done">><</link>>
<<link "10">><<run setup.rateGoddessClip(10)>><<run setup.markGoddessClipWatched()>><<goto "Goddess homework done">><</link>>
</div>
<</if>>
</div>
<</nobr>><<nobr>>
/* Legacy landing; rating links now navigate directly to Done. */
<<run setup.markGoddessClipWatched()>>
<div class="scene-panel compact">
<p class="scene-lead">Clip logged.</p>
<div class="continue-links">[[Continue|Goddess homework done]]</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<<if $flags.goddessPlaylistComplete>>
<<actor girlfriend>>
<<if $girlfriendTrustLevel gte 7>>
You actually watched every one for me. Cute. Now let's see which one wrecked you most.
<<else>>
You finished the set, but don't expect a gold star. I want to see which one wrecked you most.
<</if>>
<</actor>>
<<actor bestfriend>>
(text) Now show us which clip broke you the fastest 💅
<</actor>>
<div class="continue-links">
[[Show me my #1|Goddess homework finale]]
</div>
<<else>>
<<if $girlfriendTrustLevel gte 7>>
<<actor girlfriend>>
Good boy. You did what I asked, and I believe that rating.
<</actor>>
<<elseif $girlfriendTrustLevel lte 4>>
<<actor girlfriend>>
That was the bare minimum. Don't half-ass the next clip or its rating.
<</actor>>
<<else>>
<<actor girlfriend>>
You're done with that clip, so I won't send it again. Keep going until I've learned all your favorites.
<</actor>>
<</if>>
<<if setup.goddessBestClipIndex() neq null>>
<p class="hint-line">Current #1: clip #<<= setup.goddessBestClipIndex()>> (<<= $goddessClipScores[String(setup.goddessBestClipIndex())]>>/10)</p>
<</if>>
<<if $caged>>
<<actor-thought you>>
You remain locked after another clip, already wondering what she'll choose next.
<</actor-thought>>
<</if>>
<p class="hint-line"><<= setup.roleLabel().text>> · GF favor <<= $girlfriendTrustLevel>> · Clips left <<= setup.goddessClipsLeft()>></p>
<div class="continue-links">
[[Home]]
[[Tasks|Phone tasks]]
[[Home screen|Phone]]
</div>
<</if>>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<<set _best = setup.goddessBestClipIndex()>>
<<if _best eq null>>
<<actor girlfriend>>
(text) you rated everything meh? boring. go home.
<</actor>>
<div class="continue-links">[[Home]]</div>
<<else>>
<<actor girlfriend>>
This was your favorite. Put the sound on and watch it again for me, since we both know this is the one that wrecked you.
<</actor>>
<<actor bestfriend>>
(text) Of course he picked this one. pathetic, but kind of iconic 😈
<</actor>>
<p class="hint-line">Favorite: clip #<<= _best>> · Rating: <<= $goddessClipScores[String(_best)]>> / 10</p>
<<print setup.goddessClipHTML(_best)>>
<<actor-thought you>>
She knows exactly what gets to you. The whole set was designed to identify this one clip.
<</actor-thought>>
<<run setup.nudgeArousal(10)>>
<div class="continue-links">
[[Home]]
[[Tasks|Phone tasks]]
[[Home screen|Phone]]
</div>
<</if>>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<<actor girlfriend>>
You skipped my assignment, so don't expect me to go easy on you tomorrow morning.
<</actor>>
<<run setup.finishGoddessHomework("skip")>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Home]]</div>
</div>
<</nobr>><<nobr>>
<<if !$flags.noAlphaBoundary || !$flags.noAlphaRelationshipDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/no-alpha-friday-plans.jpg'" alt="Jenny and Alessia discussing their Friday plans">
<p class="scene-lead">These plans belong to the relationship that continues after the no-Alpha boundary.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<elseif $flags.noAlphaFridayPlansDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/no-alpha-friday-plans.jpg'" alt="Jenny and Alessia discussing their Friday plans">
<p class="scene-lead">The plans are set. Friday evening belongs to $girlfriendName, $bestfriendName, and the driver they already chose.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/no-alpha-friday-plans.jpg'" alt="Jenny and Alessia discussing their Friday plans">
<h2 class="scene-title">Friday is still hers</h2>
<p class="scene-lead">That evening, $girlfriendName leaves her phone on the table between you. $bestfriendName's name is already at the top of the screen.</p>
<<actor girlfriend>>
<<if $flags.noAlphaBoundaryOrigin eq "night-out">>I said Friday stays ours. I want to show you I understood what ours means this time.<<elseif $flags.noAlphaBoundaryOrigin eq "ultimate-stop">>You stopped the room and I listened. Friday is still ours, and nobody else is being invited.<<else>>No other men. I remember. Friday is still ours.<</if>>
$bestfriendName is coming with us. She asked whether your boundary means she has to be nice. I told her no.
<</actor>>
<<actor bestfriend>>
(text) good. i picked the lounge already. tell support boy to wear something with pockets. two phones, two coats, one useful job. 💅
<</actor>>
<p class="delayed">$girlfriendName turns the phone toward you. The key shifts against her shirt when she leans closer.</p>
<span id="conv"></span>
<div id="options">
<<you-choice "Just us three. I can do that.">>
<<set $flags.noAlphaFridayPlansDone = true>>
<<set $flags.noAlphaFridayStance = "relieved">>
<<actor girlfriend>>Do not look so relieved, baby. You are still driving, and she is going to notice that face.<</actor>>
<div class="delayed">[[Let Friday come|Home]]</div>
<</you-choice>>
<<you-choice "No flirting with men, and ask before either of you posts me.">>
<<set $flags.noAlphaFridayPlansDone = true>>
<<set $flags.noAlphaFridayStance = "clear">>
<<actor girlfriend>>No men means no men. Pictures are a separate question, and you can answer it when she asks.<</actor>>
<div class="delayed">[[Let Friday come|Home]]</div>
<</you-choice>>
<<you-choice "I agreed to us. Do not volunteer me for everything else.">>
<<set $flags.noAlphaFridayPlansDone = true>>
<<set $flags.noAlphaFridayStance = "guarded">>
<<actor girlfriend>>Then I ask. Drive us, stay with us, and say no if she pushes past what you agreed to.<</actor>>
<div class="delayed">[[Let Friday come|Home]]</div>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !$flags.noAlphaFridayPlansDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/no-alpha-friday-night.jpg'" alt="Jenny and Alessia seated together at a violet lounge">
<p class="scene-lead">$girlfriendName has not shown you the Friday plans yet.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<elseif $flags.noAlphaFridayNightDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/no-alpha-friday-night.jpg'" alt="Jenny and Alessia seated together at a violet lounge">
<p class="scene-lead">The lounge is behind you. $girlfriendName is waiting to talk at home.</p>
<div class="continue-links">[[Face the debrief|No Alpha Friday debrief]]</div>
</div>
<<elseif !setup.isFriday() || $gameDate.getHours() lt 17>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/no-alpha-friday-night.jpg'" alt="Jenny and Alessia seated together at a violet lounge">
<p class="scene-lead">Their table is booked for Friday evening.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/no-alpha-friday-night.jpg'" alt="Jenny and Alessia seated together while their driver holds both coats">
<h2 class="scene-title">The table she chose</h2>
<p class="scene-lead">At the violet-lit lounge, $girlfriendName and $bestfriendName slide into the booth before you finish hanging their coats. Both phones end up beside your drink.</p>
<p class="delayed">A server brings two extra glasses with a card from another table. $girlfriendName reads it once and pushes the tray back.</p>
<<actor girlfriend>>Please send those back. We already have the company we came with.<</actor>>
<p class="delayed">The glasses leave untouched. Your shoulders loosen before you can stop them.</p>
<<if $flags.noAlphaFridayStance eq "relieved">>
<<actor girlfriend>>You can breathe, baby. I meant what I promised. You are still carrying the coats.<</actor>>
<<elseif $flags.noAlphaFridayStance eq "clear">>
<<actor girlfriend>>No men. The picture is still a separate question, exactly like you said.<</actor>>
<<elseif $flags.noAlphaFridayStance eq "guarded">>
<<actor girlfriend>>I did not volunteer you for the rest. Answer each thing when it happens.<</actor>>
<</if>>
<<actor bestfriend>>
Look at him. You turned down one free drink and he thinks he got promoted.
Relax, loser. She heard your boundary. She did not hand you the schedule.
<</actor>>
<<actor girlfriend>><<if $flags.noAlphaFridayStance eq "guarded">>Will you take her bag, baby?<<else>>Take her bag, baby. She is right about the promotion.<</if>><</actor>>
<p class="delayed">$bestfriendName places the bag across your knees, then lifts her phone. She watches your face over the top edge instead of taking the picture.</p>
<span id="conv"></span>
<div id="options">
<<you-choice "I will carry everything. Keep the picture between us.">>
<p class="delayed">$girlfriendName nods before $bestfriendName can answer. The photo catches both women smiling above the coats in your arms, but the send screen stays on their private chat.</p>
<<actor bestfriend>>Private humiliation. Very exclusive. Try not to put it on your resume.<</actor>>
<<run setup.completeNoAlphaFridayNight("private-service")>>
<p class="delayed">The rest of the evening stays at your table. On the drive home, both coats remain in the back and $girlfriendName keeps the key visible against her chest.</p>
<div class="delayed">[[Go inside for the debrief|No Alpha Friday debrief]]</div>
<</you-choice>>
<<you-choice "No photo. Carrying the bags does not mean you can post me.">>
<p class="delayed">$bestfriendName looks at $girlfriendName. One small nod sends the phone face down beside the glasses.</p>
<<actor bestfriend>>Fine, we will have to remember your little coat-rack era without evidence.<</actor>>
<<run setup.completeNoAlphaFridayNight("no-photo")>>
<p class="delayed">Her phone stays down for the rest of the evening. During the drive home, $girlfriendName's hand rests over the key while $bestfriendName talks around you.</p>
<div class="delayed">[[Go inside for the debrief|No Alpha Friday debrief]]</div>
<</you-choice>>
<<you-choice "$girlfriendName, ask me before she adds anything else.">>
<<actor girlfriend>>Will you drive us home, carry the coats, and sit with us until we finish?<</actor>>
<<actor you>>Yes. I can do that.<</actor>>
<<actor bestfriend>>He needed his girlfriend to read the assignment twice, which is adorable.<</actor>>
<<run setup.completeNoAlphaFridayNight("ask-first")>>
<p class="delayed">They finish their drinks without adding another job. You carry what you accepted, drive them home, and watch the key remain on $girlfriendName for the whole ride.</p>
<div class="delayed">[[Go inside for the debrief|No Alpha Friday debrief]]</div>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !$flags.noAlphaFridayNightDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/no-alpha-friday-debrief.jpg'" alt="Jenny holding her key during the private Friday debrief">
<p class="scene-lead">The Friday night has not happened yet.</p>
<div class="continue-links">[[Return Home|Home]]</div>
</div>
<<elseif $flags.noAlphaFridayDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/no-alpha-friday-debrief.jpg'" alt="Jenny holding her key during the private Friday debrief">
<p class="scene-lead">The first Friday under the new rules is complete.</p>
<div class="continue-links">[[View the release notice|End of content chat]] [[Return Home|Home]]</div>
</div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/no-alpha-friday-debrief.jpg'" alt="Jenny holding her key during the private Friday debrief">
<h2 class="scene-title">What stayed hers</h2>
<p class="scene-lead">$bestfriendName leaves with her bag and a wave that does not include you. Inside, $girlfriendName sets both phones on the counter and keeps the key around her neck.</p>
<<actor girlfriend>>
<<if $flags.noAlphaFridayNightStance eq "private-service">>You agreed to carry everything, and the picture stayed between us.<<elseif $flags.noAlphaFridayNightStance eq "no-photo">>You said no photo. Her phone went down.<<else>>You made me ask again, so I asked again. You still got us home.<</if>>
<<if $flags.noAlphaBoundaryOrigin eq "night-out">>I ignored you once. I am not going to make that smaller because tonight went well.<<elseif $flags.noAlphaBoundaryOrigin eq "ultimate-stop">>You said stop that night, and the room stopped. Tonight followed the same rule.<</if>>
<</actor>>
<p class="delayed">She hooks one finger under the chain and lifts the key from her chest.</p>
<span id="conv"></span>
<div id="options">
<<you-choice "Keep the key. Tonight felt like ours again.">>
<<actor girlfriend>>It was ours. Do not confuse that with unlocked, baby.<</actor>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<run setup.completeNoAlphaFriday("keyholder")>>
<<actor bestfriend>>(text) next time i pick his shirt. relax, i do not want the key. i want to see how fast he changes when you tell him to. 💅<</actor>>
<<actor girlfriend>>(text) Request received, but no answer tonight. Check Snap, baby; I sent you something that stays ours. 💜<</actor>>
<div class="delayed continue-links">[[Open her Snap|Phone snap]] [[View the release notice|End of content chat]]</div>
<</you-choice>>
<<you-choice "I need the boundary to stay this clear.">>
<<actor girlfriend>>Then keep saying it clearly. I would rather hear you early than guess after somebody gets hurt.<</actor>>
<<run setup.completeNoAlphaFriday("boundary")>>
<<actor bestfriend>>(text) next time i pick his shirt. relax, i do not want the key. i want to see how fast he changes when you tell him to. 💅<</actor>>
<<actor girlfriend>>(text) Request received, but no answer tonight. Check Snap, baby; I sent you something that stays ours. 💜<</actor>>
<div class="delayed continue-links">[[Open her Snap|Phone snap]] [[View the release notice|End of content chat]]</div>
<</you-choice>>
<<you-choice "She can tease me. She does not decide for us.">>
<<actor girlfriend>>Correct, she gets jokes, not a vote. The key and the relationship stay between us.<</actor>>
<<run setup.completeNoAlphaFriday("shared-rules")>>
<<actor bestfriend>>(text) next time i pick his shirt. relax, i do not want the key. i want to see how fast he changes when you tell him to. 💅<</actor>>
<<actor girlfriend>>(text) Request received, but no answer tonight. Check Snap, baby; I sent you something that stays ours. 💜<</actor>>
<div class="delayed continue-links">[[Open her Snap|Phone snap]] [[View the release notice|End of content chat]]</div>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
/* Critical evening quests: Sleep skips to next morning and softlocks them */
<<silently>>
<<set _storyEvening = ($flags.keyRulesDone && $flags.sisterVisit1 && $flags.phoneLeakScareDone && !$flags.nightOutSmellDone) || ($flags.keyholderDebriefDone && $flags.bullyPresenceDone && !$flags.ultimateHumiliationDone)>>
<<set _skipEvening = !!$flags.sleepSkipEvening>>
<<set $flags.sleepSkipEvening = false>>
<</silently>>
<<if _storyEvening && !_skipEvening && $gameDate.getHours() lt 18>>
<div class="scene-panel compact sleep-panel">
<p class="scene-lead">If you sleep now you wake tomorrow morning, and miss tonight.</p>
<p class="hint-line">Her plans land after dark. Use <strong>Wait for evening</strong> first, or sleep past it on purpose.</p>
<div class="continue-links">
[[Wait for evening|Wait until evening]]
<<link "Sleep anyway (skip tonight)" "Sleep">><<set $flags.sleepSkipEvening = true>><</link>>
[[Home]]
</div>
</div>
<<else>>
<<silently>>
/* Always allow sleep, high heat = restless night, not a softlock */
<<set _restless = ($aroused gt 50)>>
<<set _dream = random(1, 6)>>
<<set _sleepLines = []>>
<<if _restless>>
<<set _sleepLines = _sleepLines.concat(["You are too wound up for real rest. When you finally drift off, you toss under damp sheets and wake at every sound."])>>
<</if>>
<<if $caged>>
<<if _dream eq 1>>
<<set _sleepLines = _sleepLines.concat(["You dream that " + $girlfriendName + " tugs the cage and laughs softly. Her amusement makes you blush more than open cruelty would."])>>
<<elseif _dream eq 2>>
<<set _sleepLines = _sleepLines.concat(["You dream of crossing the hotel lobby while the cage clicks with every step. A guest turns to look, and you wake burning with shame."])>>
<<elseif _dream eq 3 && $flags.ultimateHumiliationDone>>
<<set _sleepLines = _sleepLines.concat(["You are back in the chair beside the bed, thanking them again while they ignore you. You wake painfully hard inside the cage."])>>
<<elseif _dream eq 4 && ($flags.nightOutSmellDone || $flags.noticedSmell)>>
<<set _sleepLines = _sleepLines.concat(["In your dream, another man's cologne covers her neck. You try to ask where she has been, but the pressure of the cage wakes you before you can speak."])>>
<<elseif _dream eq 5>>
<<set _sleepLines = _sleepLines.concat(["You dream that she dangles the key just above your open hand, then pulls it away whenever you reach. Morning finds you still locked."])>>
<<else>>
<<set _sleepLines = _sleepLines.concat(["You sleep badly, shifting whenever the cage presses against the sheet. The dreams fade, but the soreness remains in the morning."])>>
<</if>>
<<elseif $world eq "anwo">>
<<if _dream eq 1>>
<<set _sleepLines = _sleepLines.concat(["You dream that students crowd around the ranking board and laugh at your name near the bottom. You wake before you can see the number beside it."])>>
<<elseif _dream eq 2>>
<<set _sleepLines = _sleepLines.concat(["In your dream, " + $teacherName + " calmly explains why someone else should control you. You wake annoyed and a little hard."])>>
<<elseif _dream eq 3>>
<<set _sleepLines = _sleepLines.concat(["Your phone keeps filling with group chat messages in the dream. Muting the thread does nothing, and every alert contains your name."])>>
<<elseif _dream eq 4 && $flags.caughtStroking1>>
<<set _sleepLines = _sleepLines.concat(["You dream of the door opening on anniversary night. You wake before anyone enters, but still glance toward the doorway."])>>
<<else>>
<<set _sleepLines = _sleepLines.concat(["You sleep restlessly. Ordinary dreams of class keep turning into ranking interviews and whispered questions."])>>
<</if>>
<<else>>
<<if _dream eq 1>>
<<set _sleepLines = _sleepLines.concat(["You sleep deeply and remember none of your dreams. The uneventful night leaves you rested."])>>
<<elseif _dream eq 2>>
<<set _sleepLines = _sleepLines.concat(["You wander beneath bright mall lights in your dream with nowhere urgent to be. You wake almost refreshed."])>>
<<elseif _dream eq 3>>
<<set _sleepLines = _sleepLines.concat(["You dream about an ordinary school day where grades are the only thing making you anxious."])>>
<<else>>
<<set _sleepLines = _sleepLines.concat(["You fall into the bed and dream nothing special."])>>
<</if>>
<</if>>
<<if $jobMailCounter > 0>>
<<set $jobMailCounter-->>
<</if>>
/* Used-panty school day ends with sleep; key never stays with bully overnight */
<<if $flags.wearingUsedPanty>>
<<set $flags.wearingUsedPanty = false>>
<<set _sleepLines = _sleepLines.concat(["You peel off last night's panties and hide them in the laundry. The cage remains tight against your sore skin."])>>
<</if>>
<<if $flags.keyWithBully>>
<<set $flags.keyWithBully = false>>
<</if>>
/* Missed Phone Tasks (Edge / Clip homework) → GF favor down before day rolls */
<<run setup.applyMissedPhoneTasks()>>
<<if $_missedTasksNote>>
<<set _sleepLines = _sleepLines.concat([String($_missedTasksNote)])>>
<<if $girlfriendTrustLevel lte 3>>
<<set _sleepLines = _sleepLines.concat(["Her reply is noticeably colder after you ignore the homework. You know she will bring it up again."])>>
<</if>>
<</if>>
/* Story nudges stay immediate and take priority over the weekly random Snap. */
<<if $flags.phoneUnlocked && !$flags.phoneOvernightPending>>
<<if $caged && !$flags.phone4Read>>
/* Story-critical DM nudge */
<<set $flags.phoneOvernightPending = true>>
<<elseif $flags.day10Confessed && !$flags.phone3Read && random(1, 3) eq 1>>
<<set $flags.phoneOvernightPending = true>>
<</if>>
<</if>>
/* One shared random Jenny/Jamal delivery each week, queued on Friday night. */
<<if !$flags.phoneOvernightPending>>
<<run setup.queueWeeklyAmbientSnap()>>
<</if>>
/* High favor: soft-unlock private gallery album (no spam) */
<<if $caged && $girlfriendTrustLevel gte 7>>
<<run setup.applyFavorGalleryBonus()>>
<</if>>
/* Cool heat overnight so you are not stuck wired forever */
<<if _restless>>
<<set $aroused = Math.max(15, Math.min(40, Math.floor($aroused * 0.35)))>>
<<set _sleepLines = _sleepLines.concat(["By morning, the ache has eased enough for you to think clearly again."])>>
<<else>>
<<set $aroused = Math.max(0, Math.floor($aroused * 0.5))>>
<</if>>
/* Roll the calendar safely */
<<run setup.advanceToNextMorning()>>
<<set $_missedTasksNote = "">>
<</silently>>
<div class="scene-panel compact sleep-panel">
<img class="hero-img sleep-img centered" @src="setup.sleepMedia()" alt="">
<div class="sleep-copy">
<<for _si to 0; _si lt _sleepLines.length; _si++>>
<p class="sleep-line"><<= _sleepLines[_si]>></p>
<</for>>
</div>
<div class="continue-links">[[Wake up|Home]]</div>
</div>
<</if>>
/* Advance same day to 19:00, used by night-out / ultimate humiliation quests.
Normal Sleep jumps to next morning 08:00 and softlocked those banners. */
<</nobr>><<nobr>>
<div class="scene-panel compact sleep-panel">
<img class="hero-img sleep-img centered" @src="setup.ImagePath+'you/bored'+ random(1, 3) +'.jpeg'" alt="">
<<if $gameDate.getHours() gte 19>>
<p class="scene-lead">It's already evening. Whatever she planned, it's time.</p>
<<else>>
<<set _wait = random(1, 3)>>
<<if _wait eq 1>>
<p class="scene-lead">You spend the afternoon scrolling on your phone and adjusting the cage. Outside, the windows fade from blue to black.</p>
<<elseif _wait eq 2>>
<p class="scene-lead">You pace, get a glass of water, and check the clock again. Waiting in the cage makes each hour drag.</p>
<<else>>
<p class="scene-lead">You almost sleep sitting up and force yourself awake, evening is the appointment.</p>
<</if>>
<<run setup.setGameHour(19)>>
<<run setup.nudgeArousal(6)>>
<p class="sleep-line">At nineteen hundred, a message arrives. You listen for her footsteps and wonder whether she will come home alone.</p>
<</if>>
<<if $caged && $flags.keyholderDebriefDone && $flags.bullyPresenceDone && !$flags.ultimateHumiliationDone>>
<div class="continue-links">
[[Face the night|Ultimate humiliation night]]
[[Home first|Home]]
</div>
<<elseif $caged && $flags.keyRulesDone && $flags.sisterVisit1 && $flags.phoneLeakScareDone && !$flags.nightOutSmellDone>>
<div class="continue-links">
[[Wait for her to come home|Night out return]]
[[Home|Home]]
</div>
<<else>>
<div class="continue-links">
[[Home]]
</div>
<</if>>
</div>
<</nobr>><<nobr>>
<<if $tempText>>
$tempText
<<set $tempText = "">>
<</if>>
You are too sleepy to keep your eyes open, so you go to bed.
[[Sleep][$aroused = 0]]
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img cage-frame" @src="setup.cageMedia()" alt="">
<h2 class="scene-title">Cage + porn</h2>
<p class="scene-lead">Choose a clip and rub the cage while you watch. It will stay locked, though you might manage a weak leak.</p>
<div class="genre-grid">
[[Girlfriend|Stroke cage gf]]
[[Soft cuckold|Stroke cage cuck]]
[[Hard cuckold|Stroke cage hard cuck]]
[[Femdom / cage tease|Stroke cage femdom]]
<<if setup.genreHas("bbc")>>[[BBC fantasy|Stroke cage bbc]]<</if>>
[[Oral / service|Stroke cage oral]]
[[Voyeur / spy|Stroke cage voyeur]]
<<if $world eq "anwo" || ($alphaBeta || 0) gt 0>>[[ANWO / hierarchy|Stroke cage anwo]]<</if>>
<<if ($alphaBeta || 0) gte 2 || $flags.googledSissy>>[[Sissy tease|Stroke cage sissy]]<</if>>
[[Just the steel|Stroke cage]]
[[Back|Jerk off]]
</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img cage-frame centered" @src="setup.cageMedia()" alt="">
<p class="delayed">You cup the cage, squeeze it, and rub along the seam through metal and skin. The lock holds while your need keeps building.</p>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/caged-stroke1.webp'" alt="">
<<actor-thought you>>
It is humiliating and hot, exactly the kind of pointless effort she enjoys. There is no relief unless she chooses to turn the key.
<<if $flags.nightOutSmellDone || $flags.noticedSmell>>
You think about the cologne on her neck and imagine someone else getting to finish with her.
<<elseif $flags.keyRulesDone>>
Her rules repeat in your head: do not unlock, tell her when you are desperate, and wait for her when she goes out.
<</if>>
<</actor-thought>>
<p class="delayed">The pressure builds until you manage a weak, leaking climax. It offers little relief and leaves a humiliating mess around the bars.</p>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/chastity-cum'+ random(1, 2) +'.webp'" alt="">
<<actor you>>
Ah... fuck, I'm still locked.
<</actor>>
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">
[[Clean up. Stay caged.|Home]]
</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img porn-frame delayed" @src="setup.ImagePath+'girlfriend/sexy'+ random(1, 4) +'.jpeg'" alt="">
<p class="scene-lead">$girlfriendName fills the screen while the key remains somewhere beyond your reach. You jiggle the cage, imagining how amused she would be by the effort.</p>
<img class="delayed centered cage-frame" @src="setup.cageMedia()" alt="">
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/caged-stroke1.webp'" alt="">
<<actor-thought you>>
She looks completely free while you grow warmer and more desperate inside the metal she chose for you.
<</actor-thought>>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/chastity-cum'+ random(1, 2) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Wipe the bars and leave the cage alone.|Home]]</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img porn-frame delayed" @src="setup.ImagePath+'cuckold/x-sex-'+ random(1, 5) +'.gif'" alt="">
<p class="scene-lead">The couple on screen takes their time while you rub the cage to the sounds they make together.</p>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/caged-stroke1.webp'" alt="">
<<actor-thought you>>
They get to finish while you remain stuck rubbing a lock. Of course this is all you get.
<</actor-thought>>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/chastity-cum'+ random(1, 2) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Clean up. Stay caged.|Home]]</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img porn-frame delayed" @src="setup.genreGif('hardcuck')" alt="">
<p class="scene-lead">You choose a rougher, louder clip and grind the cage until your thighs shake. Your cock remains trapped and useless while they fuck on screen.</p>
<img class="delayed centered cage-frame" @src="setup.cageMedia()" alt="">
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/caged-stroke1.webp'" alt="">
<<actor you>>
I'm still locked... just watching.
<</actor>>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/chastity-cum'+ random(1, 2) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Wipe off the mess without touching the lock.|Home]]</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
/* Locked-body only, cage jiggle / keyholder inspect, not free-cock femdom */
<img class="hero-img cage-frame delayed" @src="setup.cageMedia()" alt="">
<p class="scene-lead">You imagine her jiggling the cage, the key hanging from a chain as her fingernail taps the lock. One little shake is enough to remind you that you are hers.</p>
<img class="delayed centered cage-frame" @src="setup.genreGifPrefer('keyholder', 'femdom', 'cage')" alt="">
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/caged-stroke1.webp'" alt="">
<<actor-thought you>>
Yes, keyholder. You stay locked and hope she would allow you even this weak leak. She does not need to be here to control what you do.
<</actor-thought>>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/chastity-cum'+ random(1, 2) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Yes keyholder, in private|Home]]</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<<if !setup.genreHas("vesperina")>>
<p class="scene-lead">No goddess pack.</p>
<div class="continue-links">[[Back|Stroke cage menu]]</div>
<<else>>
<p class="scene-lead">You keep the sound on and give the clip your full attention. If the need becomes unbearable, you can rub the cage, but you cannot unlock it.</p>
<<print setup.vesperinaHTML()>>
<<actor-thought you>>
She fills the screen while you watch from inside your cage, hoping you might at least manage a weak leak.
<</actor-thought>>
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Close the clip and leave the cage alone.|Home]]</div>
<</if>>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<<if !setup.genreHas("bbc")>>
<p class="scene-lead">No BBC pack yet.</p>
<div class="continue-links">[[Back|Stroke cage menu]]</div>
<<else>>
<img class="hero-img porn-frame delayed" @src="setup.genreGif('bbc')" alt="">
<p class="scene-lead">The size on screen makes you look tiny beneath the metal. You jiggle the bars even though nothing can hide the comparison.</p>
<img class="delayed centered cage-frame" @src="setup.cageMedia()" alt="">
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/caged-stroke1.webp'" alt="">
<<actor-thought you>>
Your cock jerks inside the cage at the comparison, and the humiliation only makes it more effective.
<</actor-thought>>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/chastity-cum'+ random(1, 2) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Clean up smaller|Home]]</div>
<</if>>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img porn-frame delayed" @src="setup.ImagePath+'sex/licking.png'" alt="">
<p class="scene-lead">You picture yourself serving her with your tongue while your locked clitty remains useless between your legs.</p>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'gf-you/chastity-lick.png'" alt="">
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/caged-stroke1.webp'" alt="">
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/chastity-cum'+ random(1, 2) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Wipe. Stay useful later.|Home]]</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img porn-frame delayed" @src="setup.ImagePath+'park/spy-fuck'+ random(1, 3) +'.webp'" alt="">
<p class="scene-lead">You imagine spying on someone else getting the real thing while you settle for a distant view and the friction of metal against your cock.</p>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/caged-stroke1.webp'" alt="">
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/chastity-cum'+ random(1, 2) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Sneak home locked|Home]]</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img cage-frame delayed" @src="setup.cageMedia()" alt="">
<p class="scene-lead">The lecture has become porn in your head: alphas get to finish while betas remain locked and wait. Rubbing yourself through the cage feels like completing the lesson.</p>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/caged-stroke1.webp'" alt="">
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/chastity-cum'+ random(1, 2) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Close the textbook|Home]]</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img cage-frame delayed" @src="setup.ImagePath+'you/chastity-panty.png'" alt="">
<p class="scene-lead">You rub the cage while imagining yourself in something soft and feminine, replaying the quiz results that made your stomach drop.</p>
<img class="delayed centered cage-frame" @src="setup.cageMedia()" alt="">
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/caged-stroke1.webp'" alt="">
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/chastity-cum'+ random(1, 2) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Hide the history without touching the key.|Home]]</div>
</div>
<</nobr>><<nobr>>
<img @src="setup.ImagePath+'you/chastity-dildo.webp'">
<span class="delayed">You work the dildo into yourself, searching for an angle that might let you cum despite the cage.</span>
<<if random(0, 1) eq 0>>
<span class="delayed">After an hour of trying, your body is sore and you are no closer to finishing. You finally give up, frustrated but already wondering if more practice would help.</span>
[[Home][$aroused = $aroused >= 90 ? $aroused : $aroused + 10, $gameDate = setup.changeDate($gameDate, 'hours', 1)]]
<<else>>
<span class="delayed">The pressure builds slowly until you find the right rhythm. Your orgasm catches you all at once, even with your cock still trapped.</span>
<img class="delayed" @src="setup.ImagePath+'you/chastity-dildo-cum.webp'">
[[Home][$aroused = 0, $gameDate = setup.changeDate($gameDate, 'hours', 1)]]
<</if>>
<</nobr>><<nobr>>
<<if hasVisited("School 25 Day anwo") && !$flags.caughtStroking2>>
<<if $flags.day25RulesWarning>>
<p class="delayed">You sit on the edge of the bed with both hands flat on your thighs. Play by the rules, she said. You told her you could.</p>
<<else>>
<p class="delayed">You sit on the edge of the bed and try not to think about how long it has been since you finished.</p>
<</if>>
<img class="centered delayed" @src="setup.ImagePath+'you/bored'+ random(1, 3) +'.jpeg'" alt="Trying to keep both hands away from yourself">
<span id="conv"></span>
<div id="options">
<<you-choice "I'll try to obey her.">>
<<set $flags.day25TriedToObey = true>>
<p class="delayed">You shower, answer two messages, and leave your phone across the room. For a while, it works. Then every shift of your jeans drags against you. By the time you lie down, the promise feels like a dare. Your hand slips under your waistband.</p>
<img class="centered delayed" @src="setup.ImagePath+'you/jerk-off'+ random(1, 3) +'.webp'" alt="Giving in after trying to obey">
<div class="delayed continue-links">[[Just for a minute. Then stop.|Get caught stroking 2]]</div>
<</you-choice>>
<<you-choice "I'm done pretending. I'm touching myself.">>
<<set $flags.day25TriedToObey = false>>
<p class="delayed">You close the door and reach into your jeans. If you are going to fail, you want one quiet minute before anyone knows.</p>
<img class="centered delayed" @src="setup.ImagePath+'you/jerk-off'+ random(1, 3) +'.webp'" alt="Breaking the rule immediately">
<div class="delayed continue-links">[[Stroke and forget the time|Get caught stroking 2]]</div>
<</you-choice>>
</div>
<<elseif hasVisited("School 20 Day anwo") && !$flags.caughtStroking1>>
<<if $flags.anniversaryTonight>>
<p class="delayed">Anniversary night. She's waiting, or on her way. You tell yourself you'll be quick. Just enough to think straight.</p>
<<else>>
<p class="delayed">You put your hand around your cock and start stroking, still raw from class, still hungry for her.</p>
<</if>>
<img class="centered delayed" @src="setup.ImagePath+'you/jerk-off'+ random(1, 3) +'.webp'" alt="">
<div class="continue-links">
[[Try to Finish|Get caught stroking][$strokeState to "after-first-time"]]
</div>
<<elseif $strokeState eq "caged" || $caged>>
<div class="scene-panel compact">
<img class="hero-img" @src="setup.ImagePath+'you/locked1.webp'" alt="">
<p class="scene-lead">You can still try to get off while locked, but not the way you used to.</p>
<div class="genre-grid">
<<link "Stroke cage + porn">><<set _dest = setup.resolveJerkTarget("Stroke cage menu")>><<goto _dest>><</link>>
<<link "Just the steel (no clip)">><<set _dest = setup.resolveJerkTarget("Stroke cage")>><<goto _dest>><</link>>
<<if $backpack.has('dildo')>>
<<link "Dildo">><<set _dest = setup.resolveJerkTarget("Locked Dildo")>><<goto _dest>><</link>>
<</if>>
<<link "Fantasy only (no hands)">><<set _dest = setup.resolveJerkTarget("Jerk fantasy caged menu")>><<goto _dest>><</link>>
<<link "Forget it" "Home">><</link>>
</div>
</div>
<<else>>
/* Free: pick a genre, chance of step-sister walk-in before the beat */
<div class="scene-panel compact">
<img class="hero-img" @src="setup.ImagePath+'you/jerk-off'+ random(1, 3) +'.webp'" alt="">
<h2 class="scene-title">What are you into right now?</h2>
<p class="scene-lead">Pick a fantasy and let your hand follow, but remember that the door might not stay closed.</p>
<div class="genre-grid">
<<link "Girlfriend">><<set _dest = setup.resolveJerkTarget("Jerk genre gf")>><<goto _dest>><</link>>
<<link "Soft cuckold">><<set _dest = setup.resolveJerkTarget("Jerk genre cuck")>><<goto _dest>><</link>>
<<link "Hard cuckold">><<set _dest = setup.resolveJerkTarget("Jerk genre hard cuck")>><<goto _dest>><</link>>
<<link "Femdom / keyholder">><<set _dest = setup.resolveJerkTarget("Jerk genre femdom")>><<goto _dest>><</link>>
<<if setup.genreHas("bbc")>>
<<link "BBC fantasy">><<set _dest = setup.resolveJerkTarget("Jerk genre bbc")>><<goto _dest>><</link>>
<</if>>
<<link "Oral / service">><<set _dest = setup.resolveJerkTarget("Jerk genre oral")>><<goto _dest>><</link>>
<<link "Voyeur / spy">><<set _dest = setup.resolveJerkTarget("Jerk genre voyeur")>><<goto _dest>><</link>>
<<if $world eq "anwo" || ($alphaBeta || 0) gt 0>>
<<link "ANWO / hierarchy">><<set _dest = setup.resolveJerkTarget("Jerk genre anwo")>><<goto _dest>><</link>>
<</if>>
<<if ($alphaBeta || 0) gte 2 || $flags.googledSissy>>
<<link "Sissy tease">><<set _dest = setup.resolveJerkTarget("Jerk genre sissy")>><<goto _dest>><</link>>
<</if>>
<<link "Just finish quick">><<set _dest = setup.resolveJerkTarget("Jerk genre vanilla")>><<goto _dest>><</link>>
<<link "Never mind" "Home">><</link>>
</div>
</div>
<</if>>
/* Gate: maybe step-sister walks in and ruins / hijacks the session (resolved at click time by setup.resolveJerkTarget) */
<</nobr>><<nobr>>
<div class="scene-panel compact">
<p class="scene-lead">You think about $girlfriendName, her mouth, her laugh, the way she says your name when she wants something.</p>
<img class="hero-img porn-frame delayed" @src="setup.ImagePath+'girlfriend/sexy'+ random(1, 4) +'.jpeg'" alt="">
<img class="hero-img delayed" @src="setup.ImagePath+'you/jerk-off'+ random(1, 3) +'.webp'" alt="">
<p class="delayed">You stroke faster as the fantasy settles into place.</p>
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Finish|Home]]</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<p class="scene-lead">You picture her busy with someone else... sound, heat, you not invited. The jealousy hurts in a way that makes you harder.</p>
<img class="hero-img porn-frame delayed" @src="setup.ImagePath+'cuckold/x-sex-'+ random(1, 5) +'.gif'" alt="">
<img class="hero-img delayed" @src="setup.ImagePath+'you/jerk-off'+ random(1, 3) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<actor-thought you>>
You finish on a thought you will not admit out loud.
<</actor-thought>>
<div class="continue-links">[[Clean up|Home]]</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<p class="scene-lead">You imagine her moaning for him while the bed hits the wall. In the fantasy, you are only an afterthought with a hand on your cock and no claim to the key.</p>
<img class="hero-img porn-frame delayed" @src="setup.genreGif('hardcuck')" alt="">
<img class="hero-img delayed" @src="setup.ImagePath+'you/jerk-off'+ random(1, 3) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<actor-thought you>>
You cum to the idea of being unnecessary, disgusted by how perfectly it works.
<</actor-thought>>
<div class="continue-links">[[Wipe it off. Pretend you didn't.|Home]]</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<p class="scene-lead">You picture $girlfriendName holding the key while she gives you orders and taps a fingernail against the lock. She laughs every time you ask to be released.</p>
<img class="hero-img cage-frame delayed" @src="setup.cageMedia()" alt="">
<img class="hero-img cage-frame delayed" @src="setup.genreGifPrefer('keyholder', 'femdom', 'cage')" alt="">
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<actor-thought you>>
Even while you are unlocked, the keyholder fantasy is enough to make you submit before you touch yourself.
<</actor-thought>>
<div class="continue-links">[[Yes, keyholder, in your head|Home]]</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<<if !setup.genreHas("vesperina")>>
<p class="scene-lead">There is no assigned clip waiting here. Check Phone Tasks when $girlfriendName sends the next one.</p>
<div class="continue-links">[[Back|Jerk off]]</div>
<<else>>
<p class="scene-lead">You turn on the sound and watch without letting yourself finish. $girlfriendName would probably grade your performance if she knew.</p>
<<print setup.vesperinaHTML()>>
<<actor-thought you>>
<<if $caged>>
The clip loops with the sound on while you strain inside the cage, reduced to an aching audience of one.
<<else>>
The clip loops with the sound on until you finish, feeling much smaller than the fantasy on screen.
<</if>>
<</actor-thought>>
<<if $caged>>
<<run setup.nudgeArousal(12)>>
<<else>>
<<set $aroused = 0>>
<</if>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Close the clip. Still aching.|Home]]</div>
<</if>>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<<if !setup.genreHas("bbc")>>
<p class="scene-lead">That fantasy is not available in this version.</p>
<div class="continue-links">[[Back|Jerk off]]</div>
<<else>>
<p class="scene-lead">You picture her stretched and gasping, ruined for anything smaller, including you. Your hand speeds up as the shame sinks in.</p>
<img class="hero-img porn-frame delayed" @src="setup.genreGif('bbc')" alt="">
<img class="hero-img delayed" @src="setup.ImagePath+'you/jerk-off'+ random(1, 3) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<actor-thought you>>
ANWO did not invent this fantasy, but it gave you an excuse to indulge it as homework.
<</actor-thought>>
<div class="continue-links">[[Clean up smaller|Home]]</div>
<</if>>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<p class="scene-lead">In your fantasy, you kneel between her thighs and use your tongue until she finishes. You do not get to fuck her; you only get to serve.</p>
<img class="hero-img porn-frame delayed" @src="setup.ImagePath+'sex/licking.png'" alt="">
<img class="hero-img porn-frame delayed" @src="setup.ImagePath+'sex/orgasm-licking.png'" alt="">
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Wipe your mouth in the fantasy|Home]]</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<p class="scene-lead">You imagine watching through bushes and gaps in curtains while other bodies move together, confident that the night belongs to them.</p>
<img class="hero-img porn-frame delayed" @src="setup.ImagePath+'park/spy-fuck'+ random(1, 3) +'.webp'" alt="">
<img class="hero-img delayed" @src="setup.ImagePath+'you/jerk-off'+ random(1, 3) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Sneak home in your head|Home]]</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<p class="scene-lead">The lecture repeats in your head as you stroke: alphas lead, betas wait, and rank decides who holds the keys and who gets to finish.</p>
<img class="hero-img porn-frame delayed" @src="setup.ImagePath+'cuckold/x-tease-'+ random(1, 4) +'.gif'" alt="">
<img class="hero-img delayed" @src="setup.ImagePath+'you/jerk-off'+ random(1, 3) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<actor-thought you>>
You hate how easily the curriculum has turned into porn for you, and how effective it is.
<</actor-thought>>
<div class="continue-links">[[Close the textbook|Home]]</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<p class="scene-lead">You picture yourself in lace while soft, degrading words mingle with memories of the quiz results that made your stomach drop and your cock jump.</p>
<img class="hero-img porn-frame delayed" @src="setup.ImagePath+'phone/sissy1.webp'" alt="">
<img class="hero-img delayed" @src="setup.ImagePath+'you/jerk-off'+ random(1, 3) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Hide the browser history|Home]]</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<p class="scene-lead">You ignore every fantasy and focus on the friction, breathing harder until the tension finally breaks.</p>
<img class="hero-img delayed" @src="setup.ImagePath+'you/jerk-off'+ random(1, 3) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Done|Home]]</div>
</div>
/* --- Caged: fantasy genre menu (no orgasm, only heat) --- */
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img" @src="setup.ImagePath+'you/locked1.webp'" alt="">
<h2 class="scene-title">Fantasy only</h2>
<p class="scene-lead">Keep your hands off the cage and let the fantasy do the work. You will not finish, but you can make the ache worse.</p>
<div class="genre-grid">
[[Soft cuckold|Jerk fantasy caged cuck]]
[[Hard cuckold|Jerk fantasy caged hard cuck]]
[[Femdom / keyholder|Jerk fantasy caged femdom]]
<<if setup.genreHas("bbc")>>[[BBC fantasy|Jerk fantasy caged bbc]]<</if>>
[[Her + him (generic)|Jerk fantasy caged]]
[[Back|Jerk off]]
</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img" @src="setup.ImagePath+'you/locked1.webp'" alt="">
<p class="scene-lead">You keep your hands away and picture her with another man while the key remains out of reach. The ache has nowhere to go.</p>
<img class="centered delayed" @src="setup.ImagePath+'cuckold/x-sex-'+ random(1, 5) +'.gif'" alt="">
<<set $aroused = $aroused gte 95 ? 100 : $aroused + 25>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<actor-thought you>>
You are not supposed to finish. Making yourself even more desperate is the whole point.
<</actor-thought>>
<div class="continue-links">[[Suffer handsomely|Home]]</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img" @src="setup.ImagePath+'you/locked1.webp'" alt="">
<p class="scene-lead">You do not get to join them. You can only ache inside the cage while you imagine her being used by someone else.</p>
<img class="centered delayed" @src="setup.ImagePath+'cuckold/x-sex-'+ random(1, 5) +'.gif'" alt="">
<<set $aroused = $aroused gte 95 ? 100 : $aroused + 30>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Suffer handsomely|Home]]</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img" @src="setup.ImagePath+'you/locked1.webp'" alt="">
<p class="scene-lead">The fantasy grows rougher and louder while you remain locked out. Your cock jerks uselessly against the metal as everyone but you gets to finish.</p>
<img class="centered delayed" @src="setup.genreGif('hardcuck')" alt="">
<<run setup.peakArousal()>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Suffer handsomely|Home]]</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img cage-frame" @src="setup.cageMedia()" alt="">
<p class="scene-lead">You picture her dangling the key and flicking the cage while you beg in silence. She laughs because she knows you cannot do anything without her.</p>
<img class="centered delayed cage-frame" @src="setup.genreGifPrefer('keyholder', 'cage', 'femdom')" alt="">
<<set $aroused = $aroused gte 95 ? 100 : $aroused + 30>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Suffer handsomely|Home]]</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<<if !setup.genreHas("bbc")>>
<p class="scene-lead">That fantasy is not available in this version.</p>
<div class="continue-links">[[Back|Jerk fantasy caged menu]]</div>
<<else>>
<img class="hero-img" @src="setup.ImagePath+'you/locked1.webp'" alt="">
<p class="scene-lead">You stare at the difference in size as your cock tries to rise and presses painfully against the locked metal. You cannot make yourself look away.</p>
<img class="centered delayed" @src="setup.genreGif('bbc')" alt="">
<<run setup.peakArousal()>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Suffer handsomely|Home]]</div>
<</if>>
</div>
<</nobr>><<nobr>>
<p>You can no longer think clearly enough to focus on anything except stroking. You do not understand why the scene in class affected you this much, but your cock refuses to soften.</p>
<<actor you>>
I need to get it down before $girlfriendName comes over.
<</actor>>
<<include "Jerk off">>
<</nobr>><<nobr>>
/* Entire caption is nobr — SugarCube turns newlines into <br> and piles empty space in the left bar. */
<<run setup.migrateLegacyScore()>>
<<run setup.migratePublicScore()>>
<<run setup.ensureEdgeReportState()>>
<<run setup.normalizeNightlifeState()>>
<img @src="setup.ImagePath+'meta/logo-transparent.png'" class="logo">
<<if $flags.phoneUnlocked || $world eq "anwo">>
<<set _sidePhoneN = setup.phoneNotifyTotal()>>
<<set _sidePhoneGo = _sidePhoneN gt 0 ? setup.phoneNotifyPassage() : "Phone">>
<<set _sidePhoneHint = _sidePhoneN gt 0 ? setup.phoneNotifyHint() : "">>
<<if _sidePhoneN gt 0>>
<div class="chat-links sidebar-phone has-badge">
<<link `"📱 Phone · " + _sidePhoneHint` _sidePhoneGo>><<run setup.capturePhoneOrigin(passage(), _sidePhoneGo)>><</link>>
<span class="sidebar-phone-badge" aria-label="notifications"><<= _sidePhoneN >></span>
</div>
<<else>>
<div class="chat-links sidebar-phone">
<<link "📱 Phone" "Phone">><<run setup.capturePhoneOrigin(passage(), "Phone")>><</link>>
</div>
<</if>>
<</if>>
<div class="status-panel">
<div class="status-row"><span class="status-label"><<print $gameDate.toLocaleDateString(undefined,{ weekday: 'short' })>> · <<print $gameDate.getHours()>>:00</span><span>$ <<print $money>></span></div>
<div class="status-row"><span>School day <<print $schoolDay>></span><span><<print $world>></span></div>
<div class="status-row"><span class="status-label">Arousal</span><span><<print $aroused>>/100</span></div>
<div class="status-meter"><span @style="'width:' + Math.min(100, $aroused) + '%'"></span></div>
<div class="status-row"><span class="status-label">GF favor</span><span><<print $girlfriendTrustLevel>>/10</span></div>
<div class="status-meter trust"><span @style="'width:' + Math.min(100, $girlfriendTrustLevel * 10) + '%'"></span></div>
<<if $world eq "anwo">>
<div class="status-row identity-row"><span class="status-label">Mindset</span><span class="<<if setup.isResistant()>>is-resistant<<elseif setup.isDevoted()>>is-devoted<<else>>is-unsettled<</if>>"><<= setup.mindsetLabel().text>></span></div>
<div class="identity-labels" aria-hidden="true"><span>Resistance 10</span><span>Unsettled</span><span>Devotion 10</span></div>
<div class="status-meter identity" role="meter" aria-label="Resistance Devotion mindset" aria-valuemin="-10" aria-valuemax="10" @aria-valuenow="$alphaBeta">
<span class="identity-marker" @style="'left:calc(' + setup.identityPercent() + '% - 4px)'"></span>
</div>
<<if setup.classRankingUnlocked()>>
<<set _publicLabel = setup.publicRoleLabel()>><<set _publicRank = setup.getPlayerClassRank()>>
<div class="public-rank-block">
<div class="status-row public-rank-row"><span class="status-label">Public</span><span @class="_publicRank && _publicRank.isAlpha ? 'is-alpha' : 'is-beta'"><<link `_publicLabel.text + (_publicRank ? " · #" + _publicRank.rank : "")` "Phone ranks">><<run setup.capturePhoneOrigin(passage(), "Phone ranks")>><</link>></span></div>
<div class="identity-labels public-rank-labels" aria-hidden="true"><span>Alpha -10</span><span>0</span><span>Beta +10</span></div>
<div class="status-meter identity public-recognition" role="meter" aria-label="Public Alpha Beta recognition" aria-valuemin="-10" aria-valuemax="10" @aria-valuenow="$publicAlphaBeta">
<span class="identity-marker public-marker" @style="'left:calc(' + setup.publicRecognitionPercent() + '% - 4px)'"></span>
</div>
</div>
<</if>>
<</if>>
<<if $caged || $cageAcceptance isnot null>>
<div class="status-badges">
<<if $caged>><span class="status-badge hot">Caged</span><</if>>
<<if !$caged && $cageAcceptance isnot null>><span class="status-badge">Cage: $cageAcceptance</span><</if>>
</div>
<</if>>
</div>
<<if settings.debugMode>>
<div class="status-panel debug-panel">DEBUG · $strokeState / $relationshipState / $caged / $schoolDay · mindset <<= $alphaBeta>>/10 · public <<= $publicAlphaBeta>>/10 · <<= setup.personality()>> · <<print JSON.stringify($flags)>> · Open: <<textbox "_passageName" "">><<button "Go">><<goto _passageName>><</button>></div>
<</if>>
<div class="aside-links"><<link "Inventory" "Inventory">><<set $inventoryOrigin = passage()>><</link>></div>
<</nobr>><<set $day = 0>>
<<set $strokeState = 'initial'>>
<<set $relationshipState = "initial">>
<<set $world = "normal">>
<<set $sisterTaskChapter = 0>>
<<set $aroused = 0>>
<<set $followedSisterReceivingCage = false>>
<<set $gameDate = new Date(2024, 0, 1, 8, 0, 0, 0)>>
<<set $caged = false>>
<<set $work = 'unemployed'>>
<<set $jobMailCounter = 0>>
<<set $workShiftsDone = 0>>
<<set $nightlifeRep = 0>>
<<set $nightlifeShiftsDone = 0>>
<<set $schoolDay = 1>>
<<set $money = 0>>
/* Private mindset and public recognition use separate -10 (alpha) .. +10 (beta) scores. */
<<set $alphaBeta = 0>>
<<set $publicAlphaBeta = 0>>
<<set $girlfriendTrustLevel = 10>>
<<set $hustleLastDone = {}>>
/* Personality is derived live via setup.isEager()/setup.isResist()/setup.isSubmissive(); no cached $personality. */
/* Optional chapter tracker (other-agent hook; safe defaults) */
<<set $progression = {
chapter: 0,
milestone: "Starting",
completedMilestones: []
}>>
/* Quest flags (prefer these over hasVisited for progression) */
<<set $flags = {
chapterStart: "",
chapterStance: "",
identityScoreBeats: {},
recognitionScoreBeats: {},
mindsetCommitment: null,
phoneUnlocked: false,
phone1Read: false,
phone2Read: false,
googledSissy: false,
sissyHintGiven: false,
sissyTestDone: false,
sissyTestDeclined: false,
surveyPark: false,
surveySister: false,
noticedSmell: false,
keptQuietSmell: false,
caughtStroking1: false,
caughtStroking2: false,
day25TriedToObey: false,
fountain10Done: false,
fountain20Done: false,
anniversaryTonight: false,
day25RulesWarning: false,
day8SpokeUp: false,
day10Confessed: false,
day12BlameSelf: false,
day12FearBeta: false,
day12ReachedHand: false,
day13CompleteAnswer: null,
/* Day 20: true = MC exposed himself; false = he refused and stayed clothed. */
day20Exposed: null,
phone3Read: false,
phone4Read: false,
/* Day 35 → Day 40 group-chat presentation teaser */
presentationTeaseRead: false,
presentationPrepRead: false,
presentationMorningRead: false,
phoneOvernightPending: false,
phoneOvernightRead: false,
/* Avoid back-to-back identical overnight Snap lines */
lastSnapText: "",
/* One shared random Jenny/Jamal Snap slot per calendar week */
lastAmbientSnapWeekKey: "",
/* Occasional bully Snap pics (ids in setup.bullySnapCatalog) */
bullySnapQueue: [],
sisterVisit1: false,
sisterVisit2: false,
sisterVisit3: false,
giftForKeyholder: false,
giftDelivered: false,
parkChemistryDone: false,
mallRiskDone: false,
schoolKeyRiskDone: false,
phoneLeakScareDone: false,
anwoDeclined: false,
/* "Not yet" on entry mail → virus trap force-accept */
anwoDeclineCount: 0,
anwoVirusForced: false,
anwoPermanentlyDeclined: false,
anwoAccepted: false,
/* Normal day 1: saw Jenny kiss her boyfriend (pre-dump stamp) */
day1ExKissSeen: false,
mustResolveCage: false,
questHint: "",
day3SurveyDone: false,
fieldSurveyOpen: false,
/* Set at end of School 1 Day anwo — group exists before project phone chat */
anwoGroupFormed: false,
/* Overnight / home nudge after day 8 submit before day 10 class */
resultsLiveSeen: false,
day8Submitted: false,
day15Passed: false,
/* Class Alpha/Beta board (Phone Ranks app) live after Day 12 */
classListLive: false,
/* Public recognition changed since Class board / Phone Ranks was opened. */
publicRankUnread: false,
/* Post-cage cuckold / chastity optional scenes */
keyRulesDone: false,
keyRulesStance: "",
nightOutDepartureDone: false,
nightOutDepartureStance: "",
nightOutSmellDone: false,
/* Resistance split: Jenny remains keyholder, but no other men enter the relationship. */
noAlphaBoundary: false,
noAlphaRelationshipDone: false,
noAlphaBoundaryOrigin: "",
noAlphaFridayPlansDone: false,
noAlphaFridayStance: "",
noAlphaFridayNightDone: false,
noAlphaFridayNightStance: "",
noAlphaFridayDone: false,
noAlphaFridayDebriefStance: "",
cheatingBreakupDone: false,
ultimateBreakupDone: false,
cagedWaitDone: false,
cagedServiceDone: false,
firstServiceDone: false,
cagedVoyeurDone: false,
alphaProofDone: false,
/* Act III Ch2, bully presence after alpha proof */
hallwayHierarchyDone: false,
bullyCheckInDone: false,
keyholderDebriefDone: false,
bullyPresenceDone: false,
/* Act III Ch3, ultimate humiliation (after bully presence; intentional escalation) */
ultimateHumiliationDone: false,
/* Act III Ch4, morning after ultimate: permanent owned rules */
ownedMorningAfterDone: false,
/* Post-Ch4 public keyholder tease in the park */
parkKeyholderTeaseDone: false,
/* Post-Owned school checkpoints and v0.4 final-ranking chapter */
day26Done: false,
day31DataAuditDone: false,
day31Contribution: "",
day34PresentationTalkDone: false,
day34JennyStance: "",
day35PublicHumiliationDone: false,
day35EchoSeen: false,
day37SlideDecision: "",
day39RehearsalDone: false,
day39RehearsalResult: "",
day40PresentationDone: false,
day40SlideChallenged: null,
finalRankingSeen: false,
ownedPublicRoleAccepted: false,
keyholderPresentationDebriefDone: false,
doubleBullChairDone: false,
alessiaSoloTeaseSeen: false,
/* Act III Ch6, Alessia's borrowed-Friday payoff */
alessiaFridayInstructionsDone: false,
alessiaFridayDresscodeDone: false,
alessiaFridayDresscode: "",
alessiaFridayVipDone: false,
alessiaFridayDanceDone: false,
alessiaFridayDanceStance: "",
alessiaBorrowedFridayDone: false,
alessiaFridayClubStance: "",
alessiaFridayPanties: "",
alessiaFridayDriveDone: false,
alessiaFridayDebriefDone: false,
alessiaFridayDebriefStance: "",
/* Act III Ch7, Alessia's requested hour with the key */
alessiaKeyTermsDone: false,
alessiaKeyConsent: "",
alessiaKeyTouchConsent: "",
alessiaKeyFridayAt: 0,
alessiaKeyParkDone: false,
alessiaKeyParkStance: "",
alessiaKeySchoolDone: false,
alessiaKeySchoolStance: "",
alessiaKeyCafeDone: false,
alessiaKeyContactRule: "",
alessiaKeyPrepDone: false,
alessiaKeyPickupStyle: "",
alessiaKeyPickupDone: false,
alessiaKeyPickupStance: "",
alessiaKeyHandoffDone: false,
alessiaKeyTransferOccurred: false,
alessiaKeyCurrentHolder: "jenny",
alessiaKeyDriveResponse: "",
alessiaKeyDriveDone: false,
alessiaKeyReturnDone: false,
alessiaHeldKeyForHour: false,
alessiaKeyReturned: false,
alessiaKeyDebriefStance: "",
alessiaKeyChapterDone: false,
postKeySisterCheckinDone: false,
postKeyWorkCheckinDone: false,
/* Chapter break banner: set to setup.GAME_VERSION when player opens End of content (once per release) */
chapterBreakSeenVersion: "",
/* Hotel work: Jenny ordered pink brief under slacks (tier 2 setup) */
workPinkBriefOrdered: false,
workPinkBriefOn: false,
/* Boss one-time simple job pitch */
workBossBriefed: false,
/* Independent nightlife side progression: hotel trust -> park -> Velvet Rooms. */
nightlifeContactDone: false,
nightlifeContactStance: "",
nightlifeContactDayNum: null,
nightlifeContactShift: 0,
nightlifeDiscretionOneDone: false,
nightlifeDiscretionOneStance: "",
nightlifeDiscretionOneDayNum: null,
nightlifeDiscretionOneShift: 0,
nightlifeDiscretionTwoDone: false,
nightlifeDiscretionTwoStance: "",
nightlifeDiscretionTwoDayNum: null,
nightlifeDiscretionTwoShift: 0,
nightlifeParkDone: false,
nightlifeParkStance: "",
nightlifeParkDayNum: null,
nightlifeParkWcDone: false,
nightlifeParkWcStance: "",
nightlifeOfferDone: false,
nightlifeRole: "",
nightlifeOfferDayNum: null,
nightlifeTourDone: false,
nightlifeTourBoundary: "",
nightlifeTourDayNum: null,
nightlifeTrialAccepted: null,
nightlifeFirstShiftDone: false,
nightlifeFirstShiftStance: "",
nightlifeLastShiftDayNum: null,
/* Mall lingerie errands (optional side chain after keyholder debrief) */
lingerie1Done: false,
lingerie2Done: false,
lingerie3Done: false,
/* Phone Gallery, Jenny caption pics */
galleryApp: false,
galleryFavorBonus: false,
captionUnread: [],
/* Edge Report sequential caption story (0 = next is first reward) */
captionStoryProgress: 0,
noAlphaCaptionStoryProgress: 0,
edgeLastTaskId: "",
/* Edge Report / Clip homework, ~1–2× per week (day-num cooldowns) */
edgeLastDayKey: "",
edgeLastDayNum: null,
goddessLastDayKey: "",
goddessLastDayNum: null,
jennyTaskLastDayNum: null,
goddessPlaylistComplete: false,
ownedChainOpen: true,
/* Side hustles (Beta-gated paid gigs) */
hustleUnlocked: false,
hustleLastDayNum: null,
wearingUsedPanty: false,
keyWithBully: false,
sleepSkipEvening: false,
/* Step-sister random walk-in during jerk (cooldown via day num) */
sisterJerkLastDayNum: null,
/* Step-sister date-prep walk-in when visiting her (3-day CD) */
sisterDatePrepLastDayNum: null,
/* Friday date ladder: 0 gf → 1 keyholder → 2 public → 3 bull1 → 4 bull2 → 5 both → 6 alessia → 7 repeat */
fridayDateLastKey: "",
fridayDateStage: 0
}>>
/* Second bull on Fridays = her ex ($exfriendName). No separate bull2 name. */
/* Edge Report streak (repeatable keyholder tasks) */
<<set $edgeStreak = 0>>
<<set $edgeBest = 0>>
<<set $edgeHeat = 0>>
<<set $edgeBirdScore = 0>>
<<set $edgeBirdHits = 0>>
<<set $edgeBirdWon = false>>
<<set $edgeBirdRetries = 0>>
<<set $edgeTruthMistakes = 0>>
<<set $edgeTask = null>>
<<set $edgeReportState = null>>
/* Goddess homework: each clip index watched once (1…max); scores for “best of set” */
<<set $goddessWatched = []>>
<<set $goddessPendingClip = null>>
<<set $goddessClipScores = {}>>
<<set $goddessBestClip = null>>
/* Jenny caption gallery (ids from setup.captionCatalog) */
<<set $gallery = []>>
/* Passage-based utility origins. Cleared when the utility closes. */
<<set $phoneOrigin = "">>
<<set $inventoryOrigin = "">>
/* Open-ended VN chapter tracker (expand for months, no forced ending) */
<<set $storyAct = 0>>
<<set $storyBeat = "">>
<<set $chapterStartChoice = "">>
/* How the player accepted the cage: null | "eager" | "reluctant" | "forced" | "refused" */
<<set $cageAcceptance = null>>
/* Single inventory owner, Chapel Simple Inventory */
<<set $backpack to Inventory.create()>>
<<masteraudio muteonhide>>
<<cacheaudio "reception_bell" "assets/audio/work/reception_bell.mp3">>
<<cacheaudio "time_to_go_to_school" "assets/audio/time_to_go_to_school.mp3">>
<<cacheaudio "have_eyes" "assets/audio/have_eyes.mp3">><<nobr>>
<<if setup.hasPendingChapter()>>
<<set _dest = setup.applyPendingChapter()>>
<<if _dest>><<goto _dest>><</if>>
<</if>>
<div class="scene-panel start-panel">
<img class="hero-img start-18" @src="setup.ImagePath+'meta/18-jenny-stop-hc-2.png'" alt="18+">
<h2 class="scene-title">Beginning of CGC</h2>
<p class="hint-line version-line">v<<= setup.GAME_VERSION>></p>
<p class="scene-lead"><strong>All characters are 18 or older.</strong></p>
<p class="hint-line">Chastity, cuckold themes, humiliation, hierarchical power dynamics.</p>
<p class="hint-line">May include rapid light changes (stroboscopic effects).</p>
<p class="hint-line">Main story arc in progress. More chapters coming soon.</p>
<div class="continue-links">
[[I am 18+. Continue|I confirm]]
</div>
</div>
<</nobr>><<nobr>>
<p>Name the cast. Defaults are fine if you just want to play.</p>
<div class="name-card">
<img @src="setup.ImagePath+'you/pp.png'" width="72" height="72">
<div><label>You</label><<textbox "$youName" "You">></div>
</div>
<div class="name-card">
<img @src="setup.ImagePath+'sister/pp.png'" width="72" height="72">
<div><label>Adult step-sister</label><<textbox "$sisterName" "Becky">></div>
</div>
<div class="name-card">
<img @src="setup.ImagePath+'girlfriend/pp.png'" width="72" height="72">
<div><label>Crush / girlfriend</label><<textbox "$girlfriendName" "Jenny">></div>
</div>
<div class="name-card">
<img @src="setup.ImagePath+'bestfriend/pp.png'" width="72" height="72">
<div><label>Her best friend</label><<textbox "$bestfriendName" "Alessia">></div>
</div>
<div class="name-card">
<img @src="setup.ImagePath+'exfriend/pp.png'" width="72" height="72">
<div><label>Her boyfriend at the start (later her ex)</label><<textbox "$exfriendName" "Tom">></div>
</div>
<div class="name-card">
<img @src="setup.ImagePath+'bully/pp.png'" width="72" height="72">
<div><label>Bully / later first bull</label><<textbox "$bullyName" "Jamal">></div>
</div>
<div class="name-card">
<img @src="setup.ImagePath+'teacher/pp.png'" width="72" height="72">
<div><label>Teacher</label><<textbox "$teacherName" "Victoria">></div>
</div>
<div class="continue-links">
[[Start full story|Wake Up]]
[[Choose a chapter|Chapter select]]
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<h2 class="scene-title">Choose a starting point</h2>
<p class="scene-lead">Skip completed chapters and begin with a consistent story state. Cast names above are preserved.</p>
<p class="hint-line">Later quick starts preset earlier decisions, but future choices remain open.</p>
<div class="chapter-start-grid">
<article class="chapter-start-card chapter-start-recommended">
<div class="chapter-start-thumb">
<img @src="setup.ImagePath+'you/sleep1.jpeg'" alt="The MC waking up before the first school day">
<span class="chapter-start-badge">Recommended</span>
</div>
<div class="chapter-start-copy">
<h3>Full Story</h3>
<p>Normal world, Day 1. Meet everyone and make every decision yourself.</p>
<p class="hint-line">Skips nothing.</p>
<<link "Start full story">><<run setup.queueChapterStart("prologue")>><</link>>
</div>
</article>
<article class="chapter-start-card">
<div class="chapter-start-thumb">
<img @src="setup.ImagePath+'story/act1/day1-anwo-lecture.jpg'" alt="The first ANWO school briefing">
</div>
<div class="chapter-start-copy">
<h3>ANWO Begins</h3>
<p>Relationship rewrite, Day 1. Start when the new rules take hold.</p>
<p class="hint-line">Skips the normal-world introduction.</p>
<<link "Begin ANWO">><<run setup.queueChapterStart("anwo")>><</link>>
</div>
</article>
<article class="chapter-start-card">
<div class="chapter-start-thumb">
<img @src="setup.ImagePath+'story/act2/cage-lock-ready.jpg'" alt="The keyholder preparing the cage and its key">
</div>
<div class="chapter-start-copy">
<h3>The Cage Clicks</h3>
<p>Begin the keyholder relationship just after $girlfriendName locks the cage.</p>
<p class="hint-line">Skips the ANWO school setup and cage build-up.</p>
<<link "Choose previous stance" "Chapter start setup">><<set $chapterStartChoice = "cage">><</link>>
</div>
</article>
<article class="chapter-start-card">
<div class="chapter-start-thumb">
<img @src="setup.ImagePath+'story/owned/day40-class-arrival.jpg'" alt="The class gathering for the school project finale">
</div>
<div class="chapter-start-copy">
<h3>Final Ranking</h3>
<p>Begin the school project finale and the last stretch toward the presentation.</p>
<p class="hint-line">Main route: other men remain permitted.</p>
<<link "Review route assumptions" "Chapter start setup">><<set $chapterStartChoice = "final-ranking">><</link>>
</div>
</article>
<article class="chapter-start-card">
<div class="chapter-start-thumb">
<img @src="setup.ImagePath+'story/owned/ch6/alessia-instructions.jpg'" alt="Alessia preparing the borrowed-Friday instructions">
<span class="chapter-start-badge">v0.5</span>
</div>
<div class="chapter-start-copy">
<h3>Borrowed Friday</h3>
<p>Begin after the final ranking, then play through $bestfriendName's borrowed Friday and requested hour with the key.</p>
<p class="hint-line">Latest chapter. Main route with other men permitted.</p>
<<link "Review route assumptions" "Chapter start setup">><<set $chapterStartChoice = "borrowed-friday">><</link>>
</div>
</article>
</div>
<div class="continue-links delayed">[[Back to names|I confirm]]</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact chapter-stance-panel">
<<if $chapterStartChoice is "cage">>
<img class="chapter-stance-image" @src="setup.ImagePath+'story/act2/cage-lock-ready.jpg'" alt="The keyholder preparing the cage and its key">
<p class="hint-line">The Cage Clicks · Begin the keyholder relationship</p>
<<elseif $chapterStartChoice is "final-ranking">>
<img class="chapter-stance-image" @src="setup.ImagePath+'story/owned/day40-class-arrival.jpg'" alt="The class gathering for the school project finale">
<p class="hint-line">Final Ranking · Main relationship route</p>
<<elseif $chapterStartChoice is "borrowed-friday">>
<img class="chapter-stance-image" @src="setup.ImagePath+'story/owned/ch6/alessia-instructions.jpg'" alt="Alessia preparing the borrowed-Friday instructions">
<p class="hint-line">Borrowed Friday + Key for an Hour · Latest main-route chapters</p>
<<else>>
<p class="hint-line">Choose a quick start first.</p>
<</if>>
<<if $chapterStartChoice is "cage">>
<h2 class="scene-title">Choose your previous stance</h2>
<p class="scene-lead">This sets the tone of earlier decisions. The choice to permit or forbid other men still happens later in the story.</p>
<div class="chapter-stance-grid">
<article class="chapter-stance-card">
<h3>Devoted / Compliant</h3>
<p>You generally accepted <<= $girlfriendName>>'s rules and the public role assigned to you.</p>
<<link "Use devoted history">><<run setup.queueChapterStart($chapterStartChoice, "devoted")>><</link>>
</article>
<article class="chapter-stance-card">
<h3>Resistant / Defiant</h3>
<p>You challenged <<= $girlfriendName>>'s rules and defended yourself publicly.</p>
<<link "Use resistant history">><<run setup.queueChapterStart($chapterStartChoice, "resistant")>><</link>>
</article>
<article class="chapter-stance-card">
<h3>Mixed</h3>
<p>You resisted privately but often complied in public.</p>
<<link "Use mixed history">><<run setup.queueChapterStart($chapterStartChoice, "mixed")>><</link>>
</article>
</div>
<<elseif $chapterStartChoice is "final-ranking">>
<h2 class="scene-title">Main-route history</h2>
<p class="scene-lead">This quick start assumes you continued the relationship with other men permitted. $bullyName and $exfriendName are already part of $girlfriendName's Friday dynamic.</p>
<article class="chapter-stance-card">
<h3>Before you continue</h3>
<p>The No-Alpha branch reaches its current ending before this chapter. Final Ranking continues the established main route and its earlier Bull scenes.</p>
<<link "Start Final Ranking">><<run setup.queueChapterStart("final-ranking")>><</link>>
</article>
<<elseif $chapterStartChoice is "borrowed-friday">>
<h2 class="scene-title">Main-route history</h2>
<p class="scene-lead">This quick start assumes the final ranking, $girlfriendName's private debrief, and the double-bull chair night are complete.</p>
<article class="chapter-stance-card">
<h3>Before you continue</h3>
<p>The No-Alpha branch ends earlier. Borrowed Friday begins after $bestfriendName's solo club teaser, with every Ch6 choice open before it carries into the key-hour continuation.</p>
<<link "Start Borrowed Friday">><<run setup.queueChapterStart("borrowed-friday")>><</link>>
</article>
<</if>>
<div class="continue-links delayed">[[Back|Chapter select][$chapterStartChoice = ""]]</div>
</div>
<</nobr>><<nobr>>
<<if not settings.muteAudio>><<audio "time_to_go_to_school" play>><</if>>
<span class="delayed">You open your eyes to $sisterName standing in your doorway, already dressed, already impatient.</span>
<<actor sister>>
Hey $youName, it's time for school. Get up now.
<</actor>>
[[Put on clothes]]
<</nobr>><<nobr>>
<<masteraudio stop>>
<img @src="setup.ImagePath+'you/relaxed.png'">
You put on your clothes and [[go to School|'go to School ' + $world]].
<</nobr>><<nobr>>
<<inv $backpack>>
<<set _inventoryReturn = $inventoryOrigin && $inventoryOrigin neq "Inventory" ? $inventoryOrigin : "Home">>
<div class="continue-links"><<link "Return" _inventoryReturn>><<set $inventoryOrigin = "">><</link>></div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img" @src="setup.ImagePath+'places/mall.png'" alt="">
<<if $caged>>
<p class="scene-lead">Crowd noise and a secret under your clothes. Cash: <strong>$<<print $money>></strong></p>
<<elseif $money lt 15>>
<p class="scene-lead">The mall wants money. You have <strong>$<<print $money>></strong>.</p>
<<else>>
<p class="scene-lead">Stores and bad ideas. Cash: <strong>$<<print $money>></strong></p>
<</if>>
<div class="hub-actions">
<<if setup.alphaRouteOpen() && $caged && $flags.keyholderDebriefDone && (!$flags.lingerie1Done || !$flags.lingerie2Done || !$flags.lingerie3Done)>>
<<if !$flags.lingerie1Done>>
[[Lingerie boutique, her order|Lingerie errand 1]]
<<elseif !$flags.lingerie2Done>>
[[Lingerie boutique, two sets|Lingerie errand 2]]
<<else>>
[[Lingerie boutique, final order|Lingerie errand 3]]
<</if>>
<</if>>
<<if $caged && !$flags.mallRiskDone>>[[Fitting room…|Risk mall almost caught]]<</if>>
[[XXX-store]]
[[Men's toilet|Men's Toilet]]
[[Home]]
</div>
</div>
<</nobr>><<nobr>>
<<if !setup.alphaRouteOpen() || !$flags.keyholderDebriefDone || $flags.lingerie1Done>>
<div class="scene-panel compact"><p class="scene-lead">The boutique is closed to you right now.</p><div class="continue-links">[[Mall]]</div></div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'places/mall.png'" alt="">
<p class="delayed">Your phone buzzed before you even found the store map.</p>
<<actor girlfriend>>
(text) Get me a black lace set. My size is in the note, and you're paying with your card.
Don't send me pictures of the rack like a creep. Pick it up and leave.
<</actor>>
<<actor-thought you>>
You are spending your money on lace for her body while the cage rests cold beneath your jeans.
<</actor-thought>>
<p class="delayed">The boutique smells of perfume samples and new plastic hangers. Quiet music plays beneath warm lights as a clerk greets you with a polite smile.</p>
<p class="hint-line">What she ordered (product example):</p>
<div class="lingerie-products">
<div class="lingerie-product-card">
<img class="lingerie-product-img" @src="setup.lingerieURL('black-lace')" alt="black lace set">
<span class="lingerie-product-label"><<= setup.lingerieLabel('black-lace') >><span class="lingerie-product-tag">$40 · for $girlfriendName</span></span>
</div>
</div>
<p class="hint-line">Cash on hand: $<span><<= $money>></span> · set costs <strong>$40</strong></p>
<<if $money lt 40>>
<p class="delayed">You do not have the forty dollars she expects you to spend. The lace has to remain on the hanger until you earn more.</p>
<<actor-thought you>>
I need to work or find some other way to earn it. She will know if I stall.
<</actor-thought>>
<div class="continue-links">
[[Back to mall|Mall]]
[[Home, earn money first|Home]]
</div>
<<else>>
<span id="conv"></span>
<div id="options">
<<you-choice "Grab the black set. Don't overthink.">>
<<set $money -= 40>>
<<run setup.nudgeArousal(8)>>
<p class="delayed">You carry the lace to the counter between two fingers. The clerk scans it without showing any surprise.</p>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'stores/xxx-store.png'" alt=""><div><span class="name-container"><span class="name">Clerk</span></span><span class="content">Gift for someone special?</span></div></div>
<<actor you>>
Uh... Yeah, for my girlfriend.
<</actor>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'stores/xxx-store.png'" alt=""><div><span class="name-container"><span class="name">Clerk</span></span><span class="content">That's nice. I can put it in a gift bag for you.</span></div></div>
<<actor-thought you>>
You nod instead of explaining that she ordered you to buy it and kept the key to your cage.
<</actor-thought>>
<div class="delayed">[[Pay and leave|Lingerie errand 1 done]]</div>
<</you-choice>>
<<you-choice "Text her which one, need approval.">>
<<actor girlfriend>>
(text) I already told you black, so stop stalling and buy it. 🙄
<</actor>>
<<set $money -= 40>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<run setup.nudgeArousal(8)>>
<p class="delayed">You buy the black set and fold the receipt into your pocket. She replies to your confirmation with a single check mark.</p>
<div class="delayed">[[Done|Lingerie errand 1 done]]</div>
<</you-choice>>
</div>
<</if>>
</div>
<</if>>
<</nobr>><<nobr>>
<<set $flags.lingerie1Done = true>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="scene-panel compact">
<p class="delayed">Before you reach the parking lot, her reply lights your phone beneath the mall awning. You look down at the black lace in the open bag.</p>
<img class="hero-img centered delayed" @src="setup.lingerieURL('black-lace')" alt="black lace set in the shopping bag">
<<if $girlfriendTrustLevel lte 3>>
<<actor girlfriend>>
(text) Leave the bag at my place, and don't hang around waiting for a thank-you. 😐
<</actor>>
<<elseif $girlfriendTrustLevel lte 5>>
<<actor girlfriend>>
(text) I got it. I'll wear it when I feel like it, and you don't get to choose who sees it. 😏
<</actor>>
<<else>>
<<actor girlfriend>>
(text) I like buying pretty things for my body with your money. 😘
<</actor>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<</if>>
<<actor-thought you>>
You carry the bright shopping bag to the car, knowing someone else may be the one who peels the lingerie off her.
<</actor-thought>>
<div class="continue-links">
[[Mall]]
[[Home]]
[[Phone gallery]]
</div>
</div>
<</nobr>><<nobr>>
<<if !setup.alphaRouteOpen() || !$flags.lingerie1Done || $flags.lingerie2Done>>
<div class="scene-panel compact"><p class="scene-lead">The boutique is closed to you right now.</p><div class="continue-links">[[Mall]]</div></div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'places/mall.png'" alt="">
<<actor girlfriend>>
(text) Change of plans. You're buying one set for me and one for $bestfriendName.
The sizes are in the note. Mine is black lace, and hers is the loud electric blue one.
You're paying for both. She already laughed when I told her.
<</actor>>
<<actor bestfriend>>
(text) OMG, if he actually finds my size, I'm going to die laughing.
Don't expect me to help you, loser.
<</actor>>
<<actor-thought you>>
You have to buy lingerie for both women, and neither set is meant for you. You can already hear $bestfriendName laughing when she sees the bag.
<</actor-thought>>
<p class="hint-line">Both hangers (product examples):</p>
<div class="lingerie-products">
<div class="lingerie-product-card">
<img class="lingerie-product-img" @src="setup.lingerieURL('black-lace-alt')" alt="black for Jenny">
<span class="lingerie-product-label">Black lace (new set)<span class="lingerie-product-tag">for $girlfriendName</span></span>
</div>
<div class="lingerie-product-card">
<img class="lingerie-product-img" @src="setup.lingerieURL('strappy-blue')" alt="strappy electric blue for Alessia">
<span class="lingerie-product-label">Strappy electric blue<span class="lingerie-product-tag">for $bestfriendName</span></span>
</div>
</div>
<p class="delayed">The same quiet music plays when you return to the boutique. You compare $bestfriendName's bright blue straps with $girlfriendName's black lace and check both sizes twice.</p>
<p class="hint-line">Cash: $<span><<= $money>></span> · both sets <strong>$75</strong></p>
<<if $money lt 75>>
<p class="delayed">You cannot cover the seventy-five-dollar total after agreeing to buy both sets.</p>
<<actor girlfriend>>
(text) Broke and locked is a look. Go work, then come back for the lace. 🙄
<</actor>>
<div class="continue-links">
[[Mall]]
[[Home]]
</div>
<<else>>
<span id="conv"></span>
<div id="options">
<<you-choice "Buy both and try not to react.">>
<<set $money -= 75>>
<<run setup.nudgeArousal(8)>>
<p class="delayed">You place both hangers on the counter and reach for your card. The clerk glances from one size to the other before opening two bags.</p>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'stores/xxx-store.png'" alt=""><div><span class="name-container"><span class="name">Clerk</span></span><span class="content">Two gifts? Someone's having a generous day.</span></div></div>
<<actor you>>
My girlfriend, and her... friend. It's complicated.
<</actor>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'stores/xxx-store.png'" alt=""><div><span class="name-container"><span class="name">Clerk</span></span><span class="content">Uh-huh. Card when you're ready.</span></div></div>
<div class="delayed">[[Pay|Lingerie errand 2 done]]</div>
<</you-choice>>
<<you-choice "Say out loud: one for my girlfriend, one for her best friend.">>
<<set $money -= 75>>
<<run setup.nudgeArousal(12)>>
<p class="delayed">You explain who each set is for, quietly but clearly enough to be heard. The clerk pauses, then resumes folding the lace with careful professionalism.</p>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'stores/xxx-store.png'" alt=""><div><span class="name-container"><span class="name">Clerk</span></span><span class="content">All right. I'll bag them separately. Have a nice evening.</span></div></div>
<<actor-thought you>>
Your ears burn beneath the warm lights as you wait for the card reader to approve the purchase.
<</actor-thought>>
<div class="delayed">[[Leave with both bags|Lingerie errand 2 done]]</div>
<</you-choice>>
</div>
<</if>>
</div>
<</if>>
<</nobr>><<nobr>>
<<set $flags.lingerie2Done = true>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="scene-panel compact">
<img class="hero-img centered delayed" @src="setup.lingerieURL('strappy-blue')" alt="strappy blue lingerie for Alessia">
<<actor bestfriend>>
(text) He actually bought MY size???
I would ask for proof, but I don't want his sad face on my camera roll.
Thanks for the free clothes, loser. 💅
<</actor>>
<<if $girlfriendTrustLevel lte 3>>
<<actor girlfriend>>
(text) Drop off both bags and leave. $bestfriendName already knows you're paying. 😒
<</actor>>
<<else>>
<<actor girlfriend>>
(text) We might try them on together later. You're not invited to that part. 😘
(Pic for your little gallery. Loser.)
<</actor>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<</if>>
<div class="continue-links">
[[Mall]]
[[Home]]
[[Phone gallery]]
</div>
</div>
<</nobr>><<nobr>>
<<if !setup.alphaRouteOpen() || !$flags.lingerie2Done || $flags.lingerie3Done>>
<div class="scene-panel compact"><p class="scene-lead">The boutique is closed to you right now.</p><div class="continue-links">[[Mall]]</div></div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'places/mall.png'" alt="">
<<actor girlfriend>>
(text) this is the last one, so listen carefully.
buy the electric blue lace set in my size. then take the tiny emerald thong one size smaller into the fitting room and try it on.
send me a photo of the tag against your cage through the fabric, with no face in the shot.
at checkout, if they ask who the set is for, tell them, "for my bull, so he can fuck me in it."
say it word for word. i'll ask the clerk if i have to.
<</actor>>
<<actor-thought you>>
You have to buy her the electric blue set, squeeze into the emerald thong, and photograph it against the cage. Then you have to tell a stranger exactly who will enjoy the lingerie.
<</actor-thought>>
<p class="hint-line">What you have to buy (product examples):</p>
<div class="lingerie-products">
<div class="lingerie-product-card">
<img class="lingerie-product-img" @src="setup.lingerieURL('electric-blue')" alt="blue set for Jenny">
<span class="lingerie-product-label">Electric blue lace set<span class="lingerie-product-tag">her size · for him to ruin</span></span>
</div>
<div class="lingerie-product-card">
<img class="lingerie-product-img" @src="setup.lingerieURL('panty-emerald')" alt="emerald thong try-on">
<span class="lingerie-product-label">Emerald lace thong<span class="lingerie-product-tag">smaller · you try it on</span></span>
</div>
</div>
<p class="hint-line">Cash: $<span><<= $money>></span> · full order <strong>$55</strong></p>
<<if $money lt 55>>
<p class="delayed">You are fifty-five dollars short of carrying out the order she expects you to repeat word for word.</p>
<<actor girlfriend>>
(text) earn the money, then come back and say it. 🙄
<</actor>>
<div class="continue-links">
[[Mall]]
[[Home]]
</div>
<<else>>
<div class="continue-links">
[[Enter the boutique|Lingerie errand 3 fitting]]
</div>
<</if>>
</div>
<</if>>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'places/mall.png'" alt="">
<p class="delayed">You take the electric blue set and the tiny emerald thong into a fitting room. The thin curtain sways whenever someone walks past, and the quiet music does nothing to slow your pulse.</p>
<div class="lingerie-products">
<div class="lingerie-product-card">
<img class="lingerie-product-img" @src="setup.lingerieURL('panty-emerald')" alt="try-on thong">
<span class="lingerie-product-label">Emerald thong<span class="lingerie-product-tag">wrong size on purpose</span></span>
</div>
</div>
<<actor-thought you>>
You lower your jeans and hold the lace against the cage. Even behind the half-closed door, she expects photographic proof that you followed her order.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "Try the smaller pair. Snap the tag-and-cage photo.">>
<<run setup.nudgeArousal(14)>>
<p class="delayed">The undersized lace stretches tightly over the cage. Your photo comes out blurry, but she reacts with a heart three seconds after you send it.</p>
<<actor girlfriend>>
(text) look at you squeezed into those. now pay and say the line. 😘
<</actor>>
<div class="delayed">[[Checkout|Lingerie errand 3 checkout]]</div>
<</you-choice>>
<<you-choice "Freeze. Almost bail.">>
<<actor girlfriend>>
(text) i still don't see a photo. either put them on or i'll tell $bestfriendName you chickened out of panties. your call. 😒
<</actor>>
<<run setup.nudgeArousal(10)>>
<p class="delayed">You put them on and send the photo. Your hands shake when you remove the thong and return it to the hanger as if nothing happened.</p>
<div class="delayed">[[Force yourself to checkout|Lingerie errand 3 checkout]]</div>
<</you-choice>>
</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<p class="delayed">At the counter, the clerk places a soft bag beside the card reader and glances from the electric blue lace to your face.</p>
<div class="lingerie-products">
<div class="lingerie-product-card">
<img class="lingerie-product-img" @src="setup.lingerieURL('electric-blue')" alt="bag contents">
<span class="lingerie-product-label">In the bag<span class="lingerie-product-tag">for her bull</span></span>
</div>
</div>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'stores/xxx-store.png'" alt=""><div><span class="name-container"><span class="name">Clerk</span></span><span class="content">Pretty color. Who's the lucky one?</span></div></div>
<<actor-thought you>>
She has already written your answer. You try to think of a lie while the clerk waits, but the words refuse to come.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "It's… for my girlfriend. For her bull. So he can fuck her in it.">>
<<set $money -= 55>>
<<run setup.peakArousal()>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'stores/xxx-store.png'" alt=""><div><span class="name-container"><span class="name">Clerk</span></span><span class="content">Oh... all right. The card reader is ready whenever you are.</span></div></div>
<p class="delayed">The clerk does not laugh, which leaves your confession hanging in the silence between you. They seal the bag and slide it across the counter.</p>
<<actor-thought you>>
You paid and said every word she demanded. $bullyName will see her in the lace, while you leave with the receipt and the cage still locked.
<</actor-thought>>
<div class="delayed">[[Leave with the bag|Lingerie errand 3 done]]</div>
<</you-choice>>
<<you-choice "Mumble: girlfriend. anniversary. (lie)">>
<<set $money -= 55>>
<<set $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 2)>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'stores/xxx-store.png'" alt=""><div><span class="name-container"><span class="name">Clerk</span></span><span class="content">Aww. Sweet. Have a good one.</span></div></div>
<p class="delayed">Your phone vibrates before you clear the doors. She already knows. Of course she does... she told you she'd check.</p>
<<actor girlfriend>>
(text) that wasn't the line. you paid, but you still failed.
say it out loud next time or don't expect me to be soft when you come home. 🙄
<</actor>>
<<actor-thought you>>
The lie spared you thirty seconds of embarrassment, but her message makes clear that she will remember it.
<</actor-thought>>
/* Still mark done, errand complete, but colder keyholder */
<div class="delayed">[[Go|Lingerie errand 3 done shame]]</div>
<</you-choice>>
<<you-choice "Voice cracking: for her bull, so he can fuck her in it.">>
<<set $money -= 55>>
<<run setup.peakArousal()>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'stores/xxx-store.png'" alt=""><div><span class="name-container"><span class="name">Clerk</span></span><span class="content">Oh, wow. I heard you. You can use the card reader now.</span></div></div>
<p class="delayed">Your voice broke on <em>bull</em>. The clerk pretends the receipt printer is fascinating. You pretend your ears are not on fire.</p>
<<actor girlfriend>>
(text) i heard your voice crack from here. bring the bag home, and remember that the key stays with me. 😘
<</actor>>
<div class="delayed">[[Leave shaking|Lingerie errand 3 done]]</div>
<</you-choice>>
</div>
</div>
<</nobr>><<nobr>>
<<set $flags.lingerie3Done = true>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<set $storyBeat = "lingerie-errands">>
<div class="scene-panel compact">
<p class="delayed">The mall corridor feels colder when you leave. The bag swings from your hand while you replay what you said to the clerk.</p>
<<actor girlfriend>>
(text) Leave the bag at my place and keep your phone on.
<</actor>>
<p class="delayed">Soon after you drop off the bag, a photo fills your lock screen without a caption.</p>
<img class="hero-img centered porn-frame" @src="setup.lingerieURL('jenny-kiss-bed')" alt="she wore what you bought">
<<if $girlfriendTrustLevel gte 7>>
<<actor girlfriend>>
(text) I'm wearing the electric blue set you paid for while he's warm against me and you're locked.
Say thank you, keyholder, if you still want to run my errands. 😈
<</actor>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<elseif $girlfriendTrustLevel lte 3>>
<<actor girlfriend>>
(text) You bought it for me, and he gets to enjoy it. Don't text me questions.
<</actor>>
<<else>>
<<actor girlfriend>>
(text) Look what your money bought. I'm wearing the same lace with my mouth on him.
Save that to your gallery. 😏
<</actor>>
<</if>>
<<run setup.peakArousal()>>
<<actor-thought you>>
You bought the outfit, and she is already wearing it while kissing $bullyName on the bed. The sight makes you swell painfully against the cage.
<</actor-thought>>
<div class="continue-links">
[[Mall]]
[[Home]]
[[Phone gallery]]
</div>
</div>
<</nobr>><<nobr>>
<<set $flags.lingerie3Done = true>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<set $storyBeat = "lingerie-errands">>
<div class="scene-panel compact">
<p class="delayed">You still paid and carried the bag out, but the lie offers little comfort once her message arrives.</p>
<<actor girlfriend>>
(text) Your card worked, but you couldn't say one sentence for me.
Don't expect me to be nice after you changed the line.
<</actor>>
<p class="delayed">She sends the photo later to remind you who wore the set and who received her attention.</p>
<img class="hero-img centered porn-frame" @src="setup.lingerieURL('jenny-kiss-bed')" alt="she wore it for him anyway">
<<run setup.peakArousal()>>
<<actor-thought you>>
Next time, she will make you repeat the sentence more loudly and in front of someone whose reaction matters to her.
<</actor-thought>>
<div class="continue-links">
[[Mall]]
[[Home]]
</div>
</div>
<</nobr>><<nobr>>
<img class="centered" @src="setup.ImagePath+'stores/men-toilet.png'">
<p class="delayed">You use the urinal, wash your hands, and leave before anyone starts a conversation.</p>
<img class="delayed centered" @src="setup.ImagePath+'stores/men-toilet-piss.png'">
<span class="delayed">[[Mall]]</span>
<</nobr>><<nobr>>
<img class="centered" @src="setup.ImagePath+'stores/xxx-store.png'">
<p class="delayed">
Fluorescent lights wash over shelves of toys and bottles. The clerk watches the register while you browse without offering advice.
You have $$money with you.
</p>
<<if !$backpack.has('dildo')>>
<<if $money gte 50>>
<<link [[Dildo ($50), for when she keeps you locked|XXX-store]]>>
<<pickup $backpack "dildo" 1>>
<<set $money -= 50>>
<</link>>
<<else>>
Dildo ($50), not enough money
<</if>>
<<else>>
<em>You already own a dildo.</em>
<</if>>
<<if !$backpack.has('cage-lube')>>
<<if $money gte 15>>
<<link [[Cage-safe lube ($15)|XXX-store]]>>
<<pickup $backpack "cage-lube" 1>>
<<set $money -= 15>>
<</link>>
<<else>>
Cage-safe lube ($15), not enough money
<</if>>
<<else>>
<em>Lube is in your bag.</em>
<</if>>
<<if !$backpack.has('apology-gift')>>
<<if $money gte 30>>
<<link `"Nice gift for " + $girlfriendName + " ($30)"` "XXX-store buy gift">>
<<set $money -= 30>>
<</link>>
<<else>>
Nice gift for $girlfriendName ($30), not enough money
<</if>>
<<else>>
<em>The silver bracelet is wrapped in your bag for the next time you see her.</em>
<</if>>
<<if $caged && !$backpack.has('chastity-panty') && $money gte 20>>
<<link [[Soft panties that hide a cage ($20)|XXX-store]]>>
<<pickup $backpack "chastity-panty" 1>>
<<set $money -= 20>>
<</link>>
<<elseif $caged && !$backpack.has('chastity-panty')>>
Soft panties that hide a cage ($20), not enough money
<</if>>
<span>[[Mall]]</span>
<</nobr>><<nobr>>
<<pickup $backpack "apology-gift" 1>>
<p class="delayed">
You choose a slim silver bracelet and watch the clerk fold it into a small black box.
</p>
<<actor-thought you>>
If I give this to $girlfriendName, maybe she will consider unlocking me sooner. She might laugh and accept it without promising anything, but I have already spent the money.
<</actor-thought>>
<<if $caged>>
<<set $flags.giftForKeyholder = true>>
<</if>>
[[Back to store|XXX-store]]
<</nobr>><<nobr>>
<<if $flags.nightlifeContactDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/nightlife/hotel-contact.png'" alt="Mara waiting at the hotel desk">
<p class="scene-lead">The first conversation with Mara is already over.</p>
<div class="continue-links">[[Go home|Home]]</div>
</div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/nightlife/hotel-contact.png'" alt="Mara waiting at the hotel desk after the shift">
<h2 class="scene-title">The guest who remembers</h2>
<p class="scene-lead">Your boss leaves with the cash drawer. The copper-haired woman from room 314 stays at the desk. You have checked her in three times, always with different luggage and the same burgundy coat.</p>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">You remember room numbers and forget conversations. That is useful.<br>I manage privacy for a licensed adults-only venue. Everybody there is over eighteen, employed by choice, and paid properly. I am not offering you anything tonight.</span></div></div>
<<actor you>>Then why tell me?<</actor>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">Because I have watched you avoid reading names from the guest screen out loud. Most new receptionists need to be corrected.<br>I wanted to know whether that was judgment or instinct.</span></div></div>
<span id="conv"></span>
<div id="options">
<<you-choice "Guest information stays at the desk.">>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">Professional answer. Keep giving it when nobody is checking.</span></div></div>
<div class="delayed">[[Leave after her|Home][$flags.nightlifeContactDone = true; $flags.nightlifeContactStance = "professional"; $flags.nightlifeContactDayNum = $day; $flags.nightlifeContactShift = $workShiftsDone; _rep = setup.setNightlifeRep(0)]]</div>
<</you-choice>>
<<you-choice "That depends on what you expect me to hide.">>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">Nothing illegal and nothing without consent. Suspicion is healthier than pretending you have no questions.</span></div></div>
<div class="delayed">[[Clock out and go home|Home][$flags.nightlifeContactDone = true; $flags.nightlifeContactStance = "cautious"; $flags.nightlifeContactDayNum = $day; $flags.nightlifeContactShift = $workShiftsDone; _rep = setup.setNightlifeRep(0)]]</div>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !$flags.nightlifeContactDone>>
<div class="scene-panel compact"><img class="hero-img centered" @src="setup.ImagePath+'story/nightlife/hotel-discretion.png'" alt="A sealed hotel laundry bag"><p class="scene-lead">There is no private errand without the earlier conversation.</p><div class="continue-links">[[Go home|Home]]</div></div>
<<elseif $flags.nightlifeDiscretionOneDone>>
<div class="scene-panel compact"><img class="hero-img centered" @src="setup.ImagePath+'story/nightlife/hotel-discretion.png'" alt="The sealed bag ready for collection"><p class="scene-lead">The sealed bag has already left through the service entrance.</p><div class="continue-links">[[Go home|Home]]</div></div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/nightlife/hotel-discretion.png'" alt="Mara placing a sealed laundry bag beside a hotel room door">
<h2 class="scene-title">One sealed bag</h2>
<p class="scene-lead">On your next shift, Mara leaves a black laundry bag behind the desk. It is zipped, numbered, and small enough to carry without attracting attention.</p>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">Room 314 signed a private-property release. The desk copy authorizes this handoff instead of housekeeping inventory.<br>Take it to the service entrance. Celia will show you the matching number. Do not open it.</span></div></div>
<<actor-thought you>>
The bag could contain clothes, toys, cash, or nothing interesting. The sealed zip makes guessing feel more invasive than carrying it.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "Match the number and hand it over sealed.">>
<p class="delayed">Celia shows you the matching card. You pass her the unopened bag and watch her place it inside a plain case.</p>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">No questions and no improvising. That is exactly what I asked for.</span></div></div>
<div class="delayed">[[Finish the shift|Home][$flags.nightlifeDiscretionOneDone = true; $flags.nightlifeDiscretionOneStance = "sealed"; $flags.nightlifeDiscretionOneDayNum = $day; $flags.nightlifeDiscretionOneShift = $workShiftsDone; _rep = setup.setNightlifeRep(1)]]</div>
<</you-choice>>
<<you-choice "Ask Mara to confirm what kind of property it is.">>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">Wardrobe and personal equipment, all legal. You were right to ask me instead of opening it.</span></div></div>
<p class="delayed">Celia matches the number and takes the sealed bag at the service entrance.</p>
<div class="delayed">[[Finish the shift|Home][$flags.nightlifeDiscretionOneDone = true; $flags.nightlifeDiscretionOneStance = "verified"; $flags.nightlifeDiscretionOneDayNum = $day; $flags.nightlifeDiscretionOneShift = $workShiftsDone; _rep = setup.setNightlifeRep(1)]]</div>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !$flags.nightlifeDiscretionOneDone>>
<div class="scene-panel compact"><img class="hero-img centered" @src="setup.ImagePath+'story/nightlife/hotel-complaint.png'" alt="A quiet hotel corridor"><p class="scene-lead">Mara has no reason to trust you with the complaint yet.</p><div class="continue-links">[[Go home|Home]]</div></div>
<<elseif $flags.nightlifeDiscretionTwoDone>>
<div class="scene-panel compact"><img class="hero-img centered" @src="setup.ImagePath+'story/nightlife/hotel-complaint.png'" alt="The quiet hotel corridor after a complaint"><p class="scene-lead">The hallway complaint has already been settled without exposing the guests.</p><div class="continue-links">[[Go home|Home]]</div></div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/nightlife/hotel-complaint.png'" alt="The MC speaking quietly with an angry adult hotel guest in the corridor">
<h2 class="scene-title">Keep the room number quiet</h2>
<p class="scene-lead">On a later shift, a guest storms into the lobby and starts describing the couple next door loudly enough for three people to hear. Mara watches from the lift without stepping in.</p>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">Solve the noise complaint. Do not repeat either room number and do not tell him who booked the other room.</span></div></div>
<span id="conv"></span>
<div id="options">
<<you-choice "Move the complaint behind the office door.">>
<p class="delayed">You interrupt before he repeats the number, guide him into the empty office, and offer a room change. His voice drops once the lobby is no longer watching.</p>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">You controlled the space without humiliating him. That is harder than sounding tough.</span></div></div>
<div class="delayed">[[Close the desk|Home][$flags.nightlifeDiscretionTwoDone = true; $flags.nightlifeDiscretionTwoStance = "redirected"; $flags.nightlifeDiscretionTwoDayNum = $day; $flags.nightlifeDiscretionTwoShift = $workShiftsDone; _rep = setup.setNightlifeRep(1)]]</div>
<</you-choice>>
<<you-choice "Let him vent, but stop every identifying detail.">>
<p class="delayed">He complains for five full minutes. Each time he reaches for a name or room number, you cut in and return him to the noise itself.</p>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">Patient, private, and unpleasant. Most real service work is at least two of those.</span></div></div>
<div class="delayed">[[Close the desk|Home][$flags.nightlifeDiscretionTwoDone = true; $flags.nightlifeDiscretionTwoStance = "absorbed"; $flags.nightlifeDiscretionTwoDayNum = $day; $flags.nightlifeDiscretionTwoShift = $workShiftsDone; _rep = setup.setNightlifeRep(1)]]</div>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !setup.nightlifeParkReady() && !$flags.nightlifeParkDone>>
<div class="scene-panel compact"><img class="hero-img centered" @src="setup.ImagePath+'story/nightlife/park-conversation.png'" alt="Mara waiting near the park gate"><p class="scene-lead">Mara is not ready to discuss her other workplace yet.</p><div class="continue-links">[[Return to the park|Park]]</div></div>
<<elseif $flags.nightlifeParkDone>>
<div class="scene-panel compact"><img class="hero-img centered" @src="setup.ImagePath+'story/nightlife/park-conversation.png'" alt="Mara near the park gate"><p class="scene-lead">You already heard what the Velvet Rooms are. No offer has been made yet.</p><div class="continue-links">[[Return to the park|Park]]</div></div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/nightlife/park-conversation.png'" alt="Mara explaining the Velvet Rooms during a daytime park meeting">
<h2 class="scene-title">Daylight explanation</h2>
<p class="scene-lead">Mara meets you by the north gate in daylight, away from hotel guests and security cameras. She carries coffee instead of luggage.</p>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">The hotel desk is not the place for this conversation. Guests pass through it, your manager owns the floor, and I do not recruit people while they are clocked in.</span></div></div>
<p class="delayed">She gives you one of the coffees and takes the seat beside you instead of standing back to observe another hotel problem.</p>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">The Velvet Rooms are a legal adult venue. Private suites, bar service, reception, cleaning, security, and consensual sex work. Nobody is assigned sexual contact.<br>You handled two ordinary privacy problems well. That is why I am explaining it. I am still not hiring you today.</span></div></div>
<<actor you>>What would you hire me to do?<</actor>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">That depends on what you choose when there is a real offer. Operations, floor service, or a flexible trial. Your school rank does not choose for you.</span></div></div>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">One unrelated favor: a client may have left a sealed envelope behind the broken dryer here. Returning it is optional and has nothing to do with whether I offer you work.</span></div></div>
<span id="conv"></span>
<div id="options">
<<you-choice "My limits stay mine, even if I take the job.">>
<<run setup.completeNightlifePark("control")>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">Correct. If a manager dislikes that sentence, leave her workplace.</span></div></div>
<div class="delayed">[[Finish the coffee|Park]]</div>
<</you-choice>>
<<you-choice "I can listen before deciding.">>
<<run setup.completeNightlifePark("pragmatic")>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">That is all I asked for. Go home and let the idea become less dramatic.</span></div></div>
<div class="delayed">[[Finish the coffee|Park]]</div>
<</you-choice>>
<<identity-choice devotion "Tell me what being useful there could mean.">>
<<run setup.completeNightlifePark("service", "nightlife-park-service")>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">Carrying trays, preparing rooms, listening carefully, and sometimes being seen doing it. Useful does not mean available for everything.</span></div></div>
<div class="delayed">[[Finish the coffee|Park]]</div>
<</identity-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !setup.nightlifeParkWcReady()>>
<div class="scene-panel compact"><img class="hero-img centered" @src="setup.ImagePath+'story/nightlife/park-wc-envelope.png'" alt="An empty park washroom"><p class="scene-lead">There is no envelope waiting behind the dryer.</p><div class="continue-links">[[Return to the park|Park]]</div></div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/nightlife/park-wc-envelope.png'" alt="The MC finding a sealed envelope behind a broken hand dryer">
<h2 class="scene-title">Not part of the offer</h2>
<p class="scene-lead">The park washroom smells of bleach and damp concrete. Behind the broken dryer, you find a sealed envelope marked with a room-card number.</p>
<<actor-thought you>>
Mara mentioned that an embarrassed client might have hidden something here. She also said retrieving it was optional and would not decide whether she hired you.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "I'll take it sealed and leave it at the hotel desk.">>
<p class="delayed">You wash your hands, carry the envelope outside, and later lock it in the hotel drop safe. Mara sends a ten-dollar tip without asking what was inside.</p>
<div class="delayed">[[Leave the washroom|Park][$flags.nightlifeParkWcDone = true; $flags.nightlifeParkWcStance = "returned"; $money += 10]]</div>
<</you-choice>>
<<you-choice "I'm leaving it here. This isn't my responsibility.">>
<p class="delayed">You press the tape back into place and leave. The decision follows you only as far as the park gate.</p>
<div class="delayed">[[Leave the washroom|Park][$flags.nightlifeParkWcDone = true; $flags.nightlifeParkWcStance = "left" ]]</div>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !$flags.nightlifeParkDone>>
<div class="scene-panel compact"><img class="hero-img centered" @src="setup.ImagePath+'story/nightlife/hotel-offer.png'" alt="Mara holding a plain appointment card"><p class="scene-lead">Mara does not make the offer before the park conversation.</p><div class="continue-links">[[Go home|Home]]</div></div>
<<elseif $flags.nightlifeOfferDone>>
<div class="scene-panel compact"><img class="hero-img centered" @src="setup.ImagePath+'story/nightlife/hotel-offer.png'" alt="The Velvet Rooms appointment card"><p class="scene-lead">The appointment card is already in your pocket.</p><div class="continue-links">[[Go home|Home]]</div></div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/nightlife/hotel-offer.png'" alt="Mara giving the MC a plain appointment card after another hotel shift">
<h2 class="scene-title">A real offer</h2>
<p class="scene-lead">On a later shift, Mara waits until you clock out, then slides a plain appointment card across the hotel desk.</p>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">This is a paid twenty-dollar tour, not a contract. You can refuse it now or leave after seeing the venue.<br>If you continue, what kind of trial should I prepare?</span></div></div>
<span id="conv"></span>
<div id="options">
<<you-choice "Operations. Reception, privacy, and handling problems.">>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">Operations trial. You will still see what the venue is, but nobody gets to turn your job title into consent.</span></div></div>
<div class="delayed">[[Take the appointment card|Home][$flags.nightlifeOfferDone = true; $flags.nightlifeRole = "operations"; $flags.nightlifeOfferDayNum = $day; _rep = setup.setNightlifeRep(3)]]</div>
<</you-choice>>
<<you-choice "Flexible. Let me see the floor before I specialize.">>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">Flexible trial, with every task named before you accept it. That gives you information without giving me a blank check.</span></div></div>
<div class="delayed">[[Take the appointment card|Home][$flags.nightlifeOfferDone = true; $flags.nightlifeRole = "flexible"; $flags.nightlifeOfferDayNum = $day; _rep = setup.setNightlifeRep(3)]]</div>
<</you-choice>>
<<you-choice "Floor service. I want to know what that role feels like.">>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">Floor service means drinks, robes, room preparation, and following precise requests. Sexual contact remains a separate choice, never an implied duty.</span></div></div>
<div class="delayed">[[Take the appointment card|Home][$flags.nightlifeOfferDone = true; $flags.nightlifeRole = "service"; $flags.nightlifeOfferDayNum = $day; _rep = setup.setNightlifeRep(3)]]</div>
<</you-choice>>
<<you-choice "Not now. I'm not accepting the tour.">>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">Then keep the card or throw it away. I will not turn a private conversation into a debt.</span></div></div>
<div class="delayed">[[Leave after your shift|Home]]</div>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if !setup.nightlifeTourReady() && !$flags.nightlifeTourDone>>
<div class="scene-panel compact"><img class="hero-img centered" @src="setup.ImagePath+'story/nightlife/velvet-tour.png'" alt="The closed entrance of the Velvet Rooms"><p class="scene-lead">The appointment is for a later day.</p><div class="continue-links">[[Go home|Home]]</div></div>
<<elseif $flags.nightlifeTourDone>>
<div class="scene-panel compact"><img class="hero-img centered" @src="setup.ImagePath+'story/nightlife/velvet-tour.png'" alt="The reception lounge inside the Velvet Rooms"><p class="scene-lead"><<if $flags.nightlifeTrialAccepted is false>>You completed the paid tour and declined the trial shift.<<else>>You completed the tour and recorded your boundary for the trial.<</if>></p><div class="continue-links">[[Go home|Home]]</div></div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/nightlife/velvet-tour.png'" alt="Mara guiding the MC through the elegant reception lounge of the Velvet Rooms">
<h2 class="scene-title">The Velvet Rooms</h2>
<p class="scene-lead">The address leads to a renovated townhouse with frosted windows and no name beside the bell. Mara meets you at the outer door, checks the appointment card, and lets you in herself.</p>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">This room is reception. Nothing past the locked door is visible from the street, and nobody enters the corridor until reception confirms who they came to see.<br>Stay beside me for now. Watch how people work before you decide whether you belong here.</span></div></div>
<p class="delayed">An elegant lounge separates the front door from the rest of the building. The receptionist turns her tablet away before greeting a guest by his chosen name. Beyond the inner door, a cleaner knocks, waits for an answer, and only then wheels fresh linen into a suite.</p>
<p class="delayed">Mara introduces the people on duty one at a time. Each gives you the name they want used and wears a different role badge.</p>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">Red badge is security, black is operations, silver is floor service, and burgundy marks an independent provider. A badge describes work. It never replaces a yes.<br>Your trial is <<= $flags.nightlifeRole || "flexible" >>. Give me one boundary to put on the briefing sheet.</span></div></div>
<span id="conv"></span>
<div id="options">
<<you-choice "No client touches me during the trial.">>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">No client contact. Staff may still ask before adjusting your uniform or demonstrating equipment.</span></div></div>
<div class="delayed">[[Finish the paid tour|Home][$flags.nightlifeTourDone = true; $flags.nightlifeTrialAccepted = true; $flags.nightlifeTourBoundary = "no-client-touch"; $flags.nightlifeTourDayNum = $day; $money += 20; _rep = setup.setNightlifeRep(4)]]</div>
<</you-choice>>
<<you-choice "Verbal instructions are fine. Physical tasks need a separate yes.">>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">Recorded exactly that way. Nobody may treat silence as agreement.</span></div></div>
<div class="delayed">[[Finish the paid tour|Home][$flags.nightlifeTourDone = true; $flags.nightlifeTrialAccepted = true; $flags.nightlifeTourBoundary = "separate-yes"; $flags.nightlifeTourDayNum = $day; $money += 20; _rep = setup.setNightlifeRep(4)]]</div>
<</you-choice>>
<<you-choice "Keep the first shift fully nonsexual.">>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">Nonsexual first shift. There is enough real work to evaluate you without manufacturing a test.</span></div></div>
<div class="delayed">[[Finish the paid tour|Home][$flags.nightlifeTourDone = true; $flags.nightlifeTrialAccepted = true; $flags.nightlifeTourBoundary = "nonsexual"; $flags.nightlifeTourDayNum = $day; $money += 20; _rep = setup.setNightlifeRep(4)]]</div>
<</you-choice>>
<<you-choice "The tour is enough. I don't want a trial shift.">>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">Then the tour ends here. You still get the twenty dollars, and I do not schedule you.</span></div></div>
<div class="delayed">[[Leave after the paid tour|Home][$flags.nightlifeTourDone = true; $flags.nightlifeTrialAccepted = false; $flags.nightlifeTourBoundary = "declined"; $flags.nightlifeTourDayNum = $day; $money += 20; _rep = setup.setNightlifeRep(4)]]</div>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if $flags.nightlifeTourDone && $flags.nightlifeTrialAccepted is false>>
<div class="scene-panel compact"><img class="hero-img centered" @src="setup.ImagePath+'story/nightlife/first-shift.png'" alt="The Velvet Rooms reception desk"><p class="scene-lead">You declined the trial after the paid tour. Mara did not schedule a shift.</p><div class="continue-links">[[Go home|Home]]</div></div>
<<elseif !setup.nightlifeFirstShiftReady() && !$flags.nightlifeFirstShiftDone>>
<div class="scene-panel compact"><img class="hero-img centered" @src="setup.ImagePath+'story/nightlife/first-shift.png'" alt="The prepared Velvet Rooms reception desk"><p class="scene-lead">Your trial shift is scheduled for a later evening.</p><div class="continue-links">[[Go home|Home]]</div></div>
<<elseif $flags.nightlifeFirstShiftDone>>
<div class="scene-panel compact"><img class="hero-img centered" @src="setup.ImagePath+'story/nightlife/first-shift.png'" alt="The Velvet Rooms after the first shift"><p class="scene-lead">Your first Velvet shift is complete. Mara has not scheduled another shift yet.</p><div class="continue-links">[[Go home|Home]]</div></div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/nightlife/first-shift.png'" alt="The adult MC working his first evening shift at the Velvet Rooms">
<h2 class="scene-title">First shift</h2>
<<if $flags.nightlifeRole eq "operations">>
<p class="scene-lead">Mara places you behind reception. You verify appointments, keep legal names off the waiting-room screen, and quietly refuse entry to a drunk man who cannot follow the house rules.</p>
<<elseif $flags.nightlifeRole eq "service">>
<p class="scene-lead">Mara gives you a silver floor-service badge. You prepare clean robes, carry drinks, and kneel once to fasten a guest's shoe after she asks and you agree. Nobody turns the gesture into permission for more.</p>
<<else>>
<p class="scene-lead">Your flexible trial moves between reception and the floor. You verify an appointment, help redirect the drunk guest at the door, then prepare one suite and deliver sealed supplies.</p>
<</if>>
<<if $flags.nightlifeTourBoundary eq "no-client-touch">>
<p class="delayed">Your briefing sheet says <strong>no client contact</strong>. Mara redirects one guest before he reaches for your badge, and the rest of the shift stays hands-off.</p>
<<elseif $flags.nightlifeTourBoundary eq "separate-yes">>
<p class="delayed">Before every physical task, Mara names it and waits. You accept the work you chose and nobody treats the next task as automatic.</p>
<<else>>
<p class="delayed">The first shift stays fully nonsexual, exactly as recorded. Mara evaluates the work without manufacturing a test.</p>
<</if>>
<p class="delayed">Near closing, a student from a neighboring program recognizes you at the desk. He glances at the temporary badge, then at the optional legal-name field on Mara's tablet.</p>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">He already saw you working. What becomes public is still your decision.<br>Legal-name badges sync their role to the licensed ANWO work directory. An alias stays inside this building.</span></div></div>
<span id="conv"></span>
<div id="options">
<<if $flags.nightlifeRole eq "operations" || $flags.nightlifeRole eq "flexible">>
<<you-choice "Use my legal name. List me under operations.">>
<<run setup.applyRecognition("nightlife-first-operations")>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">Operations assistant, verified. The directory records that you handled privacy and refused an unsafe guest.</span></div></div>
<<set _pay = setup.completeNightlifeFirstShift("public-operations", 45)>>
<p class="delayed">Mara pays you <strong>$<<= _pay >></strong>. Your public work record updates before you leave.</p>
<div class="delayed">[[Go home after closing|Home]]</div>
<</you-choice>>
<</if>>
<<if $flags.nightlifeRole eq "service" || $flags.nightlifeRole eq "flexible">>
<<you-choice "Use my legal name. List the service work honestly.">>
<<run setup.applyRecognition("nightlife-first-service")>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">Floor service, verified. It says you followed instructions and maintained boundaries. Nothing more.</span></div></div>
<<set _pay = setup.completeNightlifeFirstShift("public-service", 45)>>
<p class="delayed">Mara pays you <strong>$<<= _pay >></strong>. The service role becomes part of your public record.</p>
<div class="delayed">[[Go home after closing|Home]]</div>
<</you-choice>>
<</if>>
<<you-choice "Use an alias. Keep this job inside the building.">>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'story/nightlife/mara-portrait.png'" alt="Mara"><div><span class="name-container"><span class="name">Mara</span></span><span class="content">Private alias recorded. The student may gossip about seeing you, but the venue confirms nothing.</span></div></div>
<<set _pay = setup.completeNightlifeFirstShift("private-alias", 45)>>
<p class="delayed">Mara pays you <strong>$<<= _pay >></strong>. Your public score remains unchanged.</p>
<div class="delayed">[[Go home after closing|Home]]</div>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<set _parkSurveyReady = !$flags.surveyPark && $gameDate.getHours() lt 22 && ($flags.fieldSurveyOpen || $flags.surveySister || hasVisited("School 5 Day anwo"))>>
<div class="scene-panel compact">
<<if $gameDate.getHours() lt 22>>
<img class="hero-img" @src="setup.ImagePath+'places/park.png'" alt="">
<<else>>
<img class="hero-img" @src="setup.ImagePath+'park/park-night.png'" alt="">
<</if>>
<<if $caged>>
<p class="scene-lead">You walk carefully through the park, aware of the cage with every step.</p>
<<elseif $world eq "anwo">>
<p class="scene-lead">The usual crowd fills the paths, now with ANWO rankings mixed into the gossip.</p>
<<elseif $gameDate.getHours() gte 22>>
<p class="scene-lead">At night, the paths are empty enough that every footstep carries.</p>
<<else>>
<p class="scene-lead">Open air. Waste time or find trouble.</p>
<</if>>
<<if _parkSurveyReady>>
<div class="quest-banner">
<strong>Field survey</strong>
<p>A group of women on a bench looks free enough to interrupt for your ANWO questionnaire.</p>
[[Interview the group|Survey - Ask Group of women]]
</div>
<<elseif !$flags.alessiaKeyChapterDone && $flags.alessiaKeyTermsDone && !$flags.alessiaKeyParkDone && setup.alessiaKeyWeekReady(5)>>
<div class="quest-banner">
<strong>Walk with your keyholder</strong>
<p>$girlfriendName is waiting by the benches with the key still around her neck.</p>
[[Find her by the benches|Key Week Park Walk]]
</div>
<<elseif setup.nightlifeParkReady()>>
<div class="quest-banner">
<strong>Mara is waiting away from the hotel</strong>
<p>After two weekends of testing your discretion, she wants a real conversation in public daylight.</p>
[[Meet her by the north gate|Nightlife Park Conversation]]
</div>
<<elseif !$flags.surveyPark && ($flags.fieldSurveyOpen || hasVisited("School 5 Day anwo")) && $gameDate.getHours() gte 22>>
<p class="hint-line">Too late for interviews, the park crowd thinned out. Come back before 22:00.</p>
<<elseif !$flags.surveyPark && $flags.day3SurveyDone && !$flags.fieldSurveyOpen && !hasVisited("School 5 Day anwo")>>
<p class="hint-line">Field interviews aren't assigned yet. Next school day hands those out.</p>
<</if>>
<div class="hub-actions">
<<if $gameDate.getHours() lt 22>>[[Hang around]]<</if>>
<<if $gameDate.getHours() lt 22>>[[Look through the bushes|Park - look through the brushes]]<</if>>
<<if _parkSurveyReady>>[[Interview the group|Survey - Ask Group of women]]<</if>>
<<if $gameDate.getHours() lt 22 and $world eq "anwo" and hasVisited("School 12 Day anwo") and !$flags.parkChemistryDone>>
<<link `"Overhear " + $bullyName + " and " + $exfriendName` "Park chemistry">><</link>>
<</if>>
<<if $caged && $flags.bullyCheckInDone && !$flags.cagedVoyeurDone && $gameDate.getHours() lt 22>>
[[Something in the bushes|Caged park witness]]
<</if>>
<<if $caged && $flags.ownedMorningAfterDone && !$flags.parkKeyholderTeaseDone && $gameDate.getHours() lt 20>>
<<if setup.scoreGate(5) || setup.scoreGate(-5)>>
<<link `$girlfriendName + " is waiting by the benches"` "Park keyholder tease">><</link>>
<<else>>
<span class="hint-line score-gate-hint">Keyholder walk locked: Devotion +5 or Resistance +5 required. Current: <<= setup.mindsetLabel().text>>.</span>
<</if>>
<</if>>
[[Men's toilet|Men's Toilet Park]]
[[Home]]
</div>
</div>
<</nobr>><<nobr>>
<img class="hero-img centered" @src="setup.ImagePath+'park/survey-women.png'">
<<actor you>>
Hey, do you have a few minutes for a survey about ANWO?
<</actor>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'park/survey-women.png'"><div><span class="name-container"><span class="name">Group of Women</span></span><span class="content">ANWO? Never heard of it. Is this some kind of a trick?</span></div></div>
<<actor you>>
No tricks, just a few questions about the Alpha New World Order. It ranks alphas above betas in school and society. Can I ask what you think?
<</actor>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'park/survey-women.png'"><div><span class="name-container"><span class="name">Group of Women</span></span><span class="content">Okay. Ask.</span></div></div>
<p class="delayed">After the questionnaire...</p>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'park/survey-women.png'"><div><span class="name-container"><span class="name">Group of Women</span></span><span class="content">That was stranger than I expected. I hated some questions, but a few made sense.</span></div></div>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'park/survey-women.png'"><div><span class="name-container"><span class="name">Group of Women</span></span><span class="content">The private stuff could be fun with someone you trust. I would not want a school board deciding it for me.</span></div></div>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'park/survey-women.png'"><div><span class="name-container"><span class="name">Group of Women</span></span><span class="content">People will take those rankings home with them. I just hope they talk to their partners first.</span></div></div>
<<actor-thought you>>
That survey pushes them toward the answers it wants. They noticed, and some of them still went along with it. 🙄
<</actor-thought>>
<div class="continue-links">
[[Park][$flags.surveyPark = true; $flags.questHint = ""; $gameDate to setup.changeDate($gameDate, 'hours', 1)]]
</div>
<</nobr>><<nobr>>
<img class="hero-img centered" @src="setup.ImagePath+'park/hang.png'">
<<if $caged>>
<p class="scene-lead">You lower yourself carefully onto a bench and adjust your jeans before anyone notices.</p>
<<else>>
<p class="scene-lead">You kill an hour watching people who look like they know where they belong.</p>
<</if>>
<<if $caged && random(1, 4) eq 1>>
<p class="delayed">A jogger glances at your belt as she passes, looks back once, and keeps running.</p>
<<actor-thought you>>
Did she see it? Your shirt covers everything, but you have been walking stiffly to keep the cage from pinching. Maybe that was enough.
<</actor-thought>>
<</if>>
<<if $flags.phoneUnlocked && random(1, 5) eq 1 && $girlfriendTrustLevel gte 8>>
<<actor girlfriend>>
(text) you're at the park again.<br>i like that you go outside.<br>don't talk to anyone cuter than me. 😘
<</actor>>
<<elseif $flags.phoneUnlocked && random(1, 5) eq 1 && $girlfriendTrustLevel gte 5>>
<<actor girlfriend>>
(text) you're at the park again. doing what?
don't answer, i already know you're doing nothing like usual. 😏
<</actor>>
<<elseif $flags.phoneUnlocked && random(1, 5) eq 1 && $girlfriendTrustLevel lte 3>>
<<actor girlfriend>>
(text) home. now. the park doesn't pay rent.
<</actor>>
<</if>>
<div class="continue-links">
[[Park][$gameDate to setup.changeDate($gameDate, 'hours', 1)]]
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/park-keyholder-tease.jpg'" alt="Jenny holding the key close on a park bench">
<p class="scene-lead">$girlfriendName is already on the bench when you arrive. Coat open. One leg crossed. The little key rests against her chest where sunlight keeps catching it.</p>
<<actor girlfriend>>
Sit. Close.
No, closer than that. I didn't bring you out here for polite space.
<</actor>>
<p class="delayed">Her thigh presses against yours. She takes your wrist and guides your hand beneath the edge of her coat, high enough to feel heat through thin fabric. Not high enough to forget where you are.</p>
<<actor-thought you>>
People pass ten feet away, their shoes scraping over gravel as a dog strains at its leash.
She kisses you without checking who is watching. You harden against the cage before you manage to kiss her back.
<</actor-thought>>
<<if $girlfriendTrustLevel gte 8>>
<<actor girlfriend>>
I missed having you this close.
You can touch me, baby. Keep that hand where I put it, and do not ask about the key.
<</actor>>
<<elseif $girlfriendTrustLevel lte 3>>
<<actor girlfriend>>
Don't mistake access for forgiveness.
You get my thigh. I keep the key. Be grateful in the correct order.
<</actor>>
<<else>>
<<actor girlfriend>>
See? I can be nice when you behave.
Keep touching me there. I will tell you if you can move your hand.
<</actor>>
<</if>>
<span id="conv"></span>
<div id="options">
<<identity-choice devotion "Hold still and let her guide your hand.">>
<<set $flags.parkKeyholderTeaseDone = true>>
<<actor girlfriend>>
Good boy. Gentle. If anyone looks, smile like this is a normal date.
And stop blushing. You are making them look.
<</actor>>
<<run setup.applyIdentity("park-keyholder-follow")>>
<<run setup.changeFavor(1)>>
<<run setup.nudgeArousal(14)>>
<div class="delayed">[[Walk the long way around the park|Park][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</identity-choice>>
<<identity-choice resistance "Five minutes unlocked. We could find somewhere private.">>
<<set $flags.parkKeyholderTeaseDone = true>>
<<actor girlfriend>>
And waste this view? No.
You wanted private because private lets you pretend you're still in charge. Keep your hand there. Behave.
<</actor>>
<<run setup.applyIdentity("park-keyholder-unlock")>>
<<run setup.changeFavor(-1)>>
<<run setup.nudgeArousal(12)>>
<div class="delayed">[[Leave with the key still against her chest|Park][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</identity-choice>>
<<you-choice "Kiss her and thank her for coming.">>
<<set $flags.parkKeyholderTeaseDone = true>>
<<actor girlfriend>>
There you are.
My boyfriend. My locked little problem. Still sweet when you stop bargaining.
<</actor>>
<<run setup.changeFavor(1)>>
<<run setup.nudgeArousal(10)>>
<div class="delayed">[[Stay beside her until the bench falls into shadow|Park][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</you-choice>>
</div>
</div>
<</nobr>><<nobr>>
<<set $flags.parkChemistryDone = true>>
<div class="scene-panel compact">
<p class="scene-lead">Near the path: <strong>$bullyName</strong> and <strong>$exfriendName</strong>, close enough to overhear.</p>
<<actor bully>>
Council thing's real. You good? You've been wound tight since the project blew up.
<</actor>>
<<actor exfriend>>
I'm fine. I just hate watching $youName play martyr with my grade.
<</actor>>
<<actor bully>>
He panicked. You would too if the teacher singled you out in front of everyone. Hey... don't freeze me out. We still ball on Fridays.
<</actor>>
<<actor exfriend>>
...Yeah. Fridays. I need that more than the hierarchy lectures.
<</actor>>
<<actor bully>>
Then show up. And stop measuring yourself against me in the locker room. It's boring when you lose before you try.
<</actor>>
<<actor exfriend>>
Easy for you to say.
<</actor>>
<<actor bully>>
Always is. That's why people relax around me. Come on... I'll buy drinks if you stop sulking like $youName.
<</actor>>
<<actor-thought you>>
They talk like old friends. Your name gets the first real laugh out of both of them.
<</actor-thought>>
<<if $caged>>
<<actor-thought you>>
The cage presses into you while they laugh. If they knew about it, the joke would get much worse.
<</actor-thought>>
<<run setup.nudgeArousal(10)>>
<</if>>
<div class="continue-links">
[[Park][$gameDate to setup.changeDate($gameDate, 'hours', 1)]]
</div>
</div>
<</nobr>><<nobr>>
<img class="hero-img centered" @src="setup.ImagePath+'park/toilet.png'">
<<if setup.nightlifeParkWcReady()>>
<div class="quest-banner">
<strong>A separate privacy problem</strong>
<p>The envelope Mara mentioned is still taped behind the broken hand dryer. Taking it is optional and not part of her job offer.</p>
[[Check behind the dryer|Nightlife Park WC]]
</div>
<<else>>
<<actor-thought you>>
Nope. I'm not going in there.
<</actor-thought>>
<</if>>
<div class="continue-links">
[[Park]]
</div>
<</nobr>><<nobr>>
<img class="delayed centered" @src="setup.ImagePath+'park/spy-fuck'+ random(1, 3) +'.webp'">
<p class="delayed">
A couple about your age lies on a blanket beneath a tree. One of them has a hand under the other's shirt. You stop behind the bushes instead of taking the path past them.
</p>
<<if $caged>>
<<actor-thought you>>
That used to be you. Hands on skin. Mouth on neck. Nothing locked between your legs.
Now you watch from the dirt. The metal bites when you shift your weight.
<</actor-thought>>
<<elseif ($alphaBeta || 0) gte 4>>
<<actor-thought you>>
You've stopped here more than once. Watching from behind the leaves gets you hard faster than picturing yourself on the blanket.
That should bother you more than it does.
<</actor-thought>>
<<else>>
<<actor-thought you>>
You should keep walking. Instead, you crouch lower when one of them reaches for the other's belt.
<</actor-thought>>
<</if>>
<<if $flags.parkChemistryDone>>
<<actor-thought you>>
Last time you were here, $bullyName and $exfriendName sat on that bench. Talking about Fridays. About her.
This couple doesn't know about hierarchies. Lucky them.
<</actor-thought>>
<</if>>
<<actor-thought you>>
A twig presses into your knee. Five more seconds, you tell yourself. You stay for ten.
<</actor-thought>>
<div class="delayed">
<<run setup.nudgeArousal(6)>>
[[I need to go | Park]]
</div>
<</nobr>><<nobr>>
<<if !$flags.anwoGroupFormed && !hasVisited("School 1 Day anwo")>>
<div class="phone" id="filterSuper">
<div class="topHeader">
<div>
<span id="timeCurrent"><<print $gameDate.getHours() + ':00'>> </span>
<i class="fa-brands fa-whatsapp fa-xl"></i>
</div>
</div>
<div class="messages">
<p class="delayed">No project thread yet. Numbers get exchanged in class first.</p>
<p class="hint-line">Go to school. The group chat lights up after Day 1.</p>
</div>
<section class="phone-nav">
<a data-passage="Phone chats" class="phone-back-btn link-internal">Chats</a>
</section>
</div>
<<else>>
<<set $flags.phone1Read = true>>
<<set $flags.anwoGroupFormed = true>>
<<set $flags.questHint = "">>
<div class="phone" id="filterSuper">
<div class="topHeader">
<div>
<span id="timeCurrent"><<print $gameDate.getHours() + ':00'>> </span>
<i class="fa-brands fa-whatsapp fa-xl"></i>
</div>
<div>
<i class="fa-solid fa-wifi fa-lg" style="position: relative; bottom: 3px; margin-right: 3px"></i>
<svg height="13" width="13" xmlns="http://www.w3.org/2000/svg" style="margin-right: 3px">
<polygon points="13,0 13,13 0,13" fill="#ddd"/>
</svg>
<svg height="15" width="8" xmlns="http://www.w3.org/2000/svg" style="margin-top: -2px;">
<rect y="2" x="2" width="4" height="2" fill="white"/>
<rect y="5" x="0" width="8" height="9" stroke="white" stroke-width="2"/>
<rect y="9" x="0" width="8" height="5" stroke="white" stroke-width="1" fill="white"/>
</svg>
</div>
</div>
<div class="messages">
<<include "School 4 Day anwo 2">>
</div>
<section class="phone-nav">
<a data-passage="Phone chats" class="phone-back-btn link-internal">Chats</a>
</section>
</div>
<</if>>
<</nobr>><<nobr>>
<<actor girlfriend>>
Made the group. Everyone say hi so I know the numbers work.
<</actor>>
<<actor bully>>
It works.
<</actor>>
<<actor exfriend>>
I have started the survey draft. I will send it tonight.
<</actor>>
<<actor girlfriend>>
Perfect. Everyone reads it before next class, then we test it on ourselves.
<</actor>>
<<actor you>>
Should we include questions about whether people actually want ANWO?
<</actor>>
<<actor bestfriend>>
Look at him contributing already.
$girlfriendName picking him last gave him something to prove. 💀
<</actor>>
<<actor exfriend>>
Yes. Support, opposition, and how people think it would affect them personally.
<</actor>>
<<actor bully>>
Ask who should be in charge. That's the only answer people will fight over.
<</actor>>
<<actor girlfriend>>
$exfriendName sends the draft. $bestfriendName checks the wording.
$bullyName and $youName, read it before class. Actually read it.
<</actor>>
<<actor bestfriend>>
I'll fix $exfriendName's commas. $bullyName is beyond help.
<</actor>>
<<actor you>>
I'll read it.
<</actor>>
<<actor bully>>
Good job, bro.
<</actor>>
<<actor girlfriend>>
Leave him alone.
Baby, tell me if any question doesn't make sense. Don't just guess. 😘
<</actor>>
<<actor exfriend>>
Draft sent.
<</actor>>
<<actor girlfriend>>
Got it. Tomorrow we see how biased $exfriendName made it.
<</actor>>
<</nobr>><<nobr>>
<<set $flags.phone2Read = true>>
<<set $flags.questHint = "">>
<div class="phone" id="filterSuper">
<div class="topHeader">
<div>
<span id="timeCurrent"><<print $gameDate.getHours() + ':00'>> </span>
<i class="fa-brands fa-whatsapp fa-xl"></i>
</div>
<div>
<i class="fa-solid fa-wifi fa-lg" style="position: relative; bottom: 3px; margin-right: 3px"></i>
<svg height="13" width="13" xmlns="http://www.w3.org/2000/svg" style="margin-right: 3px">
<polygon points="13,0 13,13 0,13" fill="#ddd"/>
</svg>
<svg height="15" width="8" xmlns="http://www.w3.org/2000/svg" style="margin-top: -2px;">
<rect y="2" x="2" width="4" height="2" fill="white"/>
<rect y="5" x="0" width="8" height="9" stroke="white" stroke-width="2"/>
<rect y="9" x="0" width="8" height="5" stroke="white" stroke-width="1" fill="white"/>
</svg>
</div>
</div>
<div class="messages">
<<include "google sissy discussion">>
</div>
<section class="phone-nav">
<a data-passage="Phone chats" class="phone-back-btn link-internal">Chats</a>
</section>
</div>
<</nobr>><<nobr>>
<<actor you>>
Hey, so $teacherName said to stay far away from "sissy" stuff before the next test.
I didn't even know what she meant, so I googled it.
<</actor>>
<<actor girlfriend>>
A sissy? Like... the meme? /* prose-ok: chat message */
<</actor>>
<<actor bully>>
Bro, why are you googling that? 💀
<</actor>>
<<actor bestfriend>>
SEND PICS or it didn't happen
Bet you bookmarked half of it already. 😈
<</actor>>
<<actor you>>
Uh. Okay:
<</actor>>
<img @src="setup.ImagePath+'phone/sissy1.webp'" class="centered delayed">
<<actor girlfriend>>
Haha, okay, that guy is kind of cute, not gonna lie.
...not like you. Different vibe. 😏
<</actor>>
<<actor bully>>
LOSER energy. Glad none of us is that. 😂
<</actor>>
<<actor exfriend>>
Speak for yourself. I'm not clicking anything with "sissy" in the URL.
...we're safe. Right?
<</actor>>
<<actor bestfriend>>
Found a quiz: What type of sissy are you? 😂
$youName, do it. For science. For our entertainment. /* prose-ok: chat message */
If you score high, I'm printing screenshots.
<</actor>>
<<actor girlfriend>>
Do NOT fail a phone test over this.
(But also, if you take the quiz, send me the result. Privately. 👀)
<</actor>>
<span id="conv"></span>
<<if !$flags.sissyTestDone && !$flags.sissyTestDeclined>>
<div id="options">
<<you-choice "Fine. I'll take it for science.">>
<<set $flags.sissyTestDeclined = false>>
<<actor bestfriend>>"For science" already sounds guilty. Open it. 💀<</actor>>
<<actor girlfriend>>Take it if you want, but send me the result before $bestfriendName turns it into a poster. 😏<</actor>>
<div class="delayed">[[Open the quiz|checkout sissy test]]</div>
<</you-choice>>
<<you-choice "No. I'm not taking a sissy quiz for your entertainment.">>
<<set $flags.sissyTestDone = false>>
<<set $flags.sissyTestDeclined = true>>
<<set $flags.questHint = "">>
<<actor bestfriend>>Boring. Scared the quiz might recognize you? 💀<</actor>>
<<actor girlfriend>>Leave him. One search was enough for class, and I'm not giving you more screenshots. 😐<</actor>>
<div class="delayed">[[Back to Chats|Phone chats]]</div>
<</you-choice>>
</div>
<<elseif $flags.sissyTestDone>>
<p class="hint-line">You already took the quiz. The result is in your browser history.</p>
<<else>>
<p class="hint-line">You refused the quiz and closed the link.</p>
<</if>>
<</nobr>><<nobr>>
<<set $flags.sissyTestDone = true>>
<<set $flags.sissyTestDeclined = false>>
<<set $flags.questHint = "">>
<img @src="setup.ImagePath+'phone/type-of-sissy.webp'" class="centered">
<<actor-thought you>>
What a weird test. There are 12 types of sissies? That's wild.
<</actor-thought>>
<div class="delayed">
You inform yourself about those 12 sissy types. To be sure you are none of them.
</div>
<div class="delayed">
After 1 hour of searching you think:
</div>
<<actor-thought you>>
Puh I'm lucky I'm none of them.
<</actor-thought>>
[[Back to Chats|Phone chats]]
<</nobr>><<nobr>>
<<set $flags.phone3Read = true>>
<div class="phone" id="filterSuper">
<div class="topHeader">
<div>
<span id="timeCurrent"><<print $gameDate.getHours() + ':00'>> </span>
<i class="fa-brands fa-whatsapp fa-xl"></i>
</div>
<div>
<i class="fa-solid fa-wifi fa-lg" style="position: relative; bottom: 3px; margin-right: 3px"></i>
<svg height="13" width="13" xmlns="http://www.w3.org/2000/svg" style="margin-right: 3px">
<polygon points="13,0 13,13 0,13" fill="#ddd"/>
</svg>
<svg height="15" width="8" xmlns="http://www.w3.org/2000/svg" style="margin-top: -2px;">
<rect y="2" x="2" width="4" height="2" fill="white"/>
<rect y="5" x="0" width="8" height="9" stroke="white" stroke-width="2"/>
<rect y="9" x="0" width="8" height="5" stroke="white" stroke-width="1" fill="white"/>
</svg>
</div>
</div>
<div class="messages">
<<include "Group chat after day10">>
</div>
<section class="phone-nav">
<a data-passage="Phone chats" class="phone-back-btn link-internal">Chats</a>
</section>
</div>
<</nobr>><<nobr>>
<<actor bully>>
Sooo, $youName tried to confess for the whole group in front of $teacherName. 🔥
<</actor>>
<<actor bestfriend>>
He waited until the report was public and grew a conscience. 💀
$youName really said, "Let me ruin the grade in front of everyone."
<</actor>>
<<actor exfriend>>
Don't message like that in a chat she might screenshot.
<</actor>>
<<actor girlfriend>>
Hey, enough.
He handled it badly. I'll talk to him.
We are protecting the grade, so stop making screenshots worse.
<</actor>>
<<actor bully>>
Protecting her little survey boy. 🥺
<</actor>>
<<actor girlfriend>>
Watch yourself. I said grade, not a free pass forever.
<</actor>>
<<actor you>>
I didn't mean to make it worse.
<</actor>>
<<actor bestfriend>>
You never do. 😌
Next time, tell us before you tell the teacher with the council contacts.
Give us five minutes to stop you from making it worse.
<</actor>>
<<actor exfriend>>
Play along for now. Council is already involved, and panicking in public makes us all look guilty.
<</actor>>
<<actor girlfriend>>
$youName, walk me tomorrow. Privately. This is not a debate in caps lock.
And don't make me look soft in the hallway.
<</actor>>
<<actor bully>>
Lol, "private."
Anyway, I'm free if anyone needs "alpha tutoring." 😏
<</actor>>
<<actor girlfriend>>
Muted him for an hour. Problem solved. ✨
Get some sleep. $youName, behave.
<</actor>>
<</nobr>><<nobr>>
<<set $flags.phone4Read = true>>
<div class="phone" id="filterSuper">
<div class="topHeader">
<div>
<span id="timeCurrent"><<print $gameDate.getHours() + ':00'>> </span>
<i class="fa-brands fa-whatsapp fa-xl"></i>
</div>
<div>
<i class="fa-solid fa-wifi fa-lg" style="position: relative; bottom: 3px; margin-right: 3px"></i>
<svg height="13" width="13" xmlns="http://www.w3.org/2000/svg" style="margin-right: 3px">
<polygon points="13,0 13,13 0,13" fill="#ddd"/>
</svg>
<svg height="15" width="8" xmlns="http://www.w3.org/2000/svg" style="margin-top: -2px;">
<rect y="2" x="2" width="4" height="2" fill="white"/>
<rect y="5" x="0" width="8" height="9" stroke="white" stroke-width="2"/>
<rect y="9" x="0" width="8" height="5" stroke="white" stroke-width="1" fill="white"/>
</svg>
</div>
</div>
<div class="messages">
<<include "GF private after cage">>
</div>
<section class="phone-nav">
<a data-passage="Phone chats" class="phone-back-btn link-internal">Chats</a>
</section>
</div>
<</nobr>><<nobr>>
<<actor girlfriend>>
Hey. Just us, not the group. /* prose-ok: private text */
<</actor>>
<<if $cageAcceptance eq "eager">>
<<actor girlfriend>>
Still thinking about that click? 🔐
You asked for it. Don't act shocked if I enjoy the key.
<</actor>>
<<elseif $cageAcceptance eq "reluctant">>
<<actor girlfriend>>
I know last night was a lot.
Leave the cage alone and talk to me if the fit feels wrong.
<</actor>>
<<else>>
<<actor girlfriend>>
How does it feel this morning?
Don't say "fine." I can already picture you fidgeting.
<</actor>>
<</if>>
<<actor girlfriend>>
$sisterName texted me "you're welcome" with a smug emoji
If she makes you do weird chores, tell me... Or don't, if you're into it. 😏
<</actor>>
<<actor you>>
I'll... manage.
<</actor>>
<<actor girlfriend>>
You'll manage. Wear loose pants and try to walk normally at school.
And $youName?
If you buy me something nice with your sad hotel money, I might unlock a little longer next time.
I'm mostly kidding. 😘
<</actor>>
<</nobr>><<nobr>>
<<set _chatBadge = setup.phoneChatBadge()>>
<<set _taskBadge = setup.phoneTaskBadge()>>
<<set _snapBadge = setup.phoneSnapBadge()>>
<div class="phone-shell phone-home">
<div class="phone-shell-top">
<span class="phone-shell-time"><<print $gameDate.getHours()>>:00</span>
<span class="phone-shell-title">Phone</span>
<span class="phone-shell-icons" aria-hidden="true">▮▮▮</span>
</div>
<div class="phone-home-body">
<p class="phone-home-label">Apps</p>
<div class="phone-app-grid">
<a data-passage="Phone chats" class="phone-app-link link-internal" tabindex="0">
<div class="phone-app">
<div class="phone-app-icon phone-app-icon-chat">💬</div>
<<if _chatBadge gt 0>><span class="phone-app-badge"><<= _chatBadge>></span><</if>>
<span class="phone-app-name">Chats</span>
</div>
</a>
<a data-passage="Phone tasks" class="phone-app-link link-internal" tabindex="0">
<div class="phone-app">
<div class="phone-app-icon phone-app-icon-tasks">✅</div>
<<if _taskBadge gt 0>><span class="phone-app-badge"><<= _taskBadge>></span><</if>>
<span class="phone-app-name">Tasks</span>
</div>
</a>
<a data-passage="Phone snap" class="phone-app-link link-internal" tabindex="0">
<div class="phone-app">
<div class="phone-app-icon phone-app-icon-snap" aria-hidden="true">👻</div>
<<if _snapBadge gt 0>><span class="phone-app-badge"><<= _snapBadge>></span><</if>>
<span class="phone-app-name">Snap</span>
</div>
</a>
<<if $flags.sissyHintGiven && !$flags.googledSissy>>
<a data-passage="Google sissy" class="phone-app-link link-internal" tabindex="0">
<div class="phone-app">
<div class="phone-app-icon phone-app-icon-browser">🔍</div>
<span class="phone-app-badge">!</span>
<span class="phone-app-name">Browser</span>
</div>
</a>
<<else>>
<div class="phone-app phone-app-disabled" title="Nothing to search right now">
<div class="phone-app-icon phone-app-icon-browser">🔍</div>
<span class="phone-app-name">Browser</span>
</div>
<</if>>
<<if setup.galleryAppOpen()>>
<<run setup.applyFavorGalleryBonus()>>
<a data-passage="Phone gallery" class="phone-app-link link-internal" tabindex="0">
<div class="phone-app">
<div class="phone-app-icon phone-app-icon-gallery">🖼️</div>
/* New pics badge lives on Snap (delivery), Gallery is the save album */
<span class="phone-app-name">Gallery</span>
</div>
</a>
<<elseif $caged && $girlfriendTrustLevel gte 5>>
<div class="phone-app phone-app-disabled" title="She hasn't shared pics yet, keep favor up">
<div class="phone-app-icon phone-app-icon-gallery">🖼️</div>
<span class="phone-app-name">Gallery</span>
</div>
<</if>>
<<if setup.classRankingUnlocked()>>
<a data-passage="Phone ranks" class="phone-app-link link-internal" tabindex="0">
<div class="phone-app">
<div class="phone-app-icon phone-app-icon-ranks">📊</div>
<span class="phone-app-name">Ranks</span>
</div>
</a>
<<elseif $world eq "anwo">>
<div class="phone-app phone-app-disabled" title="Provisional list not posted yet">
<div class="phone-app-icon phone-app-icon-ranks">📊</div>
<span class="phone-app-name">Ranks</span>
</div>
<</if>>
<a data-passage="Phone patreon" class="phone-app-link link-internal" tabindex="0">
<div class="phone-app">
<div class="phone-app-icon phone-app-icon-patreon" aria-hidden="true">P</div>
<span class="phone-app-name">Patreon</span>
</div>
</a>
</div>
<<if _taskBadge gt 0>>
<p class="phone-home-hint"><<= setup.phoneTaskDueHint() || "Tasks has homework waiting.">></p>
<</if>>
<<if _snapBadge gt 0>>
<p class="phone-home-hint">New snap waiting.</p>
<</if>>
<<if _taskBadge lte 0 && _snapBadge lte 0 && _chatBadge gt 0>>
<p class="phone-home-hint">Unread chats.</p>
<<elseif _taskBadge lte 0 && _snapBadge lte 0 && _chatBadge lte 0>>
<p class="phone-home-hint">No new alerts.</p>
<</if>>
</div>
<div class="phone-shell-bottom">
<<set _phoneClose = setup.phoneCloseDestination()>><<link "Close" _phoneClose>><<set $phoneOrigin = "">><</link>>
</div>
</div>
<</nobr>><<nobr>>
<div class="phone-shell">
<div class="phone-shell-top">
<span class="phone-shell-time"><<print $gameDate.getHours()>>:00</span>
<span class="phone-shell-title">Chats</span>
<span class="phone-shell-icons" aria-hidden="true">▮▮▮</span>
</div>
<div class="chat-list">
<<set _new1 = !$flags.phone1Read>>
<<set _cls1 = _new1 ? "chat-row is-new" : "chat-row">>
<a data-passage="phone message 1" class="chat-link link-internal" tabindex="0">
<div @class="_cls1">
<img class="chat-avatar" @src="setup.ImagePath + 'girlfriend/pp.png'" alt="">
<div class="chat-row-main">
<div class="chat-row-top">
<span class="chat-row-name">ANWO Project</span>
<<if _new1>><span class="chat-pill">new</span><</if>>
</div>
<div class="chat-row-preview"><<= $girlfriendName>>, <<= $bullyName>>, <<= $exfriendName>>, <<= $bestfriendName>></div>
</div>
</div>
</a>
<<if $flags.day8Submitted>>
<<set _newResults = !$flags.resultsLiveSeen>>
<<set _clsResults = _newResults ? "chat-row is-new" : "chat-row">>
<a data-passage="phone results live" class="chat-link link-internal" tabindex="0">
<div @class="_clsResults">
<img class="chat-avatar" @src="setup.ImagePath + 'exfriend/pp.png'" alt="">
<div class="chat-row-main">
<div class="chat-row-top">
<span class="chat-row-name">ANWO Project · update</span>
<<if _newResults>><span class="chat-pill">new</span><</if>>
</div>
<div class="chat-row-preview"><<= $exfriendName>>: results are live…</div>
</div>
</div>
</a>
<</if>>
<<if $flags.day35PublicHumiliationDone && !$flags.presentationTeaseRead && !$flags.finalRankingSeen>>
<<set _clsPresentation = "chat-row is-new">>
<a data-passage="phone presentation tease" class="chat-link link-internal" tabindex="0">
<div @class="_clsPresentation">
<img class="chat-avatar" @src="setup.ImagePath + 'bestfriend/pp.png'" alt="">
<div class="chat-row-main">
<div class="chat-row-top">
<span class="chat-row-name">ANWO Project · presentation</span>
<span class="chat-pill">new</span>
</div>
<div class="chat-row-preview"><<= $bestfriendName>>: put my slide last 🤭</div>
</div>
</div>
</a>
<</if>>
<<if $flags.presentationTeaseRead && $flags.day37SlideDecision && !$flags.presentationPrepRead && !$flags.finalRankingSeen>>
<a data-passage="phone presentation prep" class="chat-link link-internal" tabindex="0">
<div class="chat-row is-new">
<img class="chat-avatar" @src="setup.ImagePath + 'bestfriend/pp.png'" alt="">
<div class="chat-row-main">
<div class="chat-row-top">
<span class="chat-row-name">ANWO Project · presentation</span>
<span class="chat-pill">new</span>
</div>
<div class="chat-row-preview"><<= $bestfriendName>>: <<if $flags.day37SlideDecision eq "warn">>your approved deck survived 🙄<<else>>wait until you see the last slide 🤭<</if>></div>
</div>
</div>
</a>
<</if>>
<<if $flags.presentationPrepRead && $flags.day39RehearsalDone && !$flags.presentationMorningRead && !$flags.day40PresentationDone>>
<a data-passage="phone presentation morning" class="chat-link link-internal" tabindex="0">
<div class="chat-row is-new">
<img class="chat-avatar" @src="setup.ImagePath + 'girlfriend/pp.png'" alt="">
<div class="chat-row-main">
<div class="chat-row-top">
<span class="chat-row-name"><<= $girlfriendName>></span>
<span class="chat-pill">new</span>
</div>
<div class="chat-row-preview">wear the black shirt today and don't be late.</div>
</div>
</div>
</a>
<</if>>
<<if $flags.presentationMorningRead && !$flags.finalRankingSeen>>
<a data-passage="phone presentation morning" class="chat-link link-internal" tabindex="0">
<div class="chat-row">
<img class="chat-avatar" @src="setup.ImagePath + 'girlfriend/pp.png'" alt="">
<div class="chat-row-main">
<div class="chat-row-top"><span class="chat-row-name">ANWO Project · presentation</span></div>
<div class="chat-row-preview">Presentation-day instructions</div>
</div>
</div>
</a>
<</if>>
<<if $flags.googledSissy>>
<<set _new2 = !$flags.phone2Read>>
<<set _cls2 = _new2 ? "chat-row is-new" : "chat-row">>
<a data-passage="phone message 2" class="chat-link link-internal" tabindex="0">
<div @class="_cls2">
<img class="chat-avatar" @src="setup.ImagePath + 'phone/sissy1.webp'" alt="">
<div class="chat-row-main">
<div class="chat-row-top">
<span class="chat-row-name">Sissy research</span>
<<if _new2>><span class="chat-pill">new</span><</if>>
</div>
<div class="chat-row-preview">Group chat about the quiz…</div>
</div>
</div>
</a>
<</if>>
<<if $flags.day10Confessed || hasVisited("School 10 Day anwo")>>
<<set _new3 = !$flags.phone3Read>>
<<set _cls3 = _new3 ? "chat-row is-new" : "chat-row">>
<a data-passage="phone message 3" class="chat-link link-internal" tabindex="0">
<div @class="_cls3">
<img class="chat-avatar" @src="setup.ImagePath + 'bestfriend/pp.png'" alt="">
<div class="chat-row-main">
<div class="chat-row-top">
<span class="chat-row-name">After the confession</span>
<<if _new3>><span class="chat-pill">new</span><</if>>
</div>
<div class="chat-row-preview">Drama in the group…</div>
</div>
</div>
</a>
<</if>>
<<if $caged>>
<<set _new4 = !$flags.phone4Read>>
<<set _cls4 = _new4 ? "chat-row is-new" : "chat-row">>
<a data-passage="phone message 4" class="chat-link link-internal" tabindex="0">
<div @class="_cls4">
<img class="chat-avatar" @src="setup.ImagePath + 'girlfriend/pp.png'" alt="">
<div class="chat-row-main">
<div class="chat-row-top">
<span class="chat-row-name"><<= $girlfriendName>></span>
<<if _new4>><span class="chat-pill">new</span><</if>>
</div>
<div class="chat-row-preview">Private DM</div>
</div>
</div>
</a>
<</if>>
/* Caption pics deliver via Snap app, not Chats */
</div>
<div class="phone-shell-bottom">
[[Home screen|Phone]]
<<set _phoneClose = setup.phoneCloseDestination()>><<link "Close" _phoneClose>><<set $phoneOrigin = "">><</link>>
</div>
</div>
<</nobr>><<nobr>>
<<set $flags.presentationTeaseRead = true>>
<div class="phone" id="filterSuper">
<div class="topHeader">
<div>
<span id="timeCurrent"><<print $gameDate.getHours() + ':00'>> </span>
<i class="fa-brands fa-whatsapp fa-xl"></i>
</div>
</div>
<div class="messages">
<<actor bestfriend>>
Presentation rehearsal recap:
$bullyName opens, $exfriendName covers the totals, and $girlfriendName runs the deck.
$youName gets the field question because he caught the sample error. Try to look surprised. 🤭
<</actor>>
<<actor bully>>
Works for me. He did the interviews, so let him answer one question.
Then take the mic away before he confesses again. 😂
<</actor>>
<<actor exfriend>>
Can we keep the Friday jokes out of the actual slides?
The council is going to see this.
<</actor>>
<<actor bestfriend>>
That's why my draft goes last. 💅
It is not project evidence. It is context.
<</actor>>
<img class="centered" @src="setup.ImagePath+'story/owned/day40-presentation-rehearsal.jpg'" alt="Jenny rehearsing the final presentation at home">
<<actor bestfriend>>
Screenshot of the slide header. Don't show him the rest yet. 🤭
<</actor>>
<<actor bully>>
Keep the private version out of the submitted deck. Funny is not worth losing the grade. 😂
<</actor>>
<<actor girlfriend>>
Photo from rehearsal. The layout looks fine.
$bestfriendName, stop writing his private life into my grade.
<</actor>>
<<actor bestfriend>>
Private? $bullyName knows, I know, and half the class watches him stare at your key. 💀
I'm not inventing anything. I'm just connecting the council note to the obvious supervisor.
<</actor>>
<<actor girlfriend>>
$youName, wear the black shirt on presentation day. bring the handouts and your corrected notes.
When the field question comes, answer it. Don't hand your work back to us. 😘
<</actor>>
<<actor-thought you>>
On presentation day, your field correction goes on the screen. $bestfriendName still has a private draft and access to the shared folder.
You put the phone down and immediately pick it up to read the messages again.
<</actor-thought>>
</div>
<section class="phone-nav">
<a data-passage="Phone chats" class="phone-back-btn link-internal">Chats</a>
</section>
</div>
<</nobr>><<nobr>>
<<set $flags.presentationPrepRead = true>>
<div class="phone" id="filterSuper">
<div class="topHeader">
<div>
<span id="timeCurrent"><<print $gameDate.getHours() + ':00'>> </span>
<i class="fa-brands fa-whatsapp fa-xl"></i>
</div>
</div>
<div class="messages">
<img class="centered" @src="setup.ImagePath+'story/owned/day37-hidden-slide.jpg'" alt="the rehearsal laptop with the unauthorized private slide">
<<if $flags.day37SlideDecision eq "warn">>
<<actor bestfriend>>
Deck update: $girlfriendName deleted my private version and locked the upload.
Your hall monitor got the approved deck he wanted. Tragic. 💀
<</actor>>
<<actor bully>>Good. Funny is not worth tanking the grade. 😂<</actor>>
<<actor exfriend>>The approval log matches the locked file. Leave it that way.<</actor>>
<<actor girlfriend>>
$youName, your corrected notes are still in the deck.
Bring the handouts and black shirt for presentation day. I will handle the upload. 😘
<</actor>>
<<actor-thought you>>The private edits are gone. Your field correction remains under your name.<</actor-thought>>
<<else>>
<<actor bestfriend>>
Slide deck update: The sample correction is in.
$youName gets his field credit. I still think the private version explains the group better. 💀
<</actor>>
<<actor bully>>
Keep it in the chat, not the council upload. 😂
<</actor>>
<<actor bestfriend>>
Fine. The graded deck stays boring.
I saved my version, obviously. 🤭
<</actor>>
<<actor exfriend>>
Are we really putting all of that on a slide? The council sees these.
<</actor>>
<<actor bestfriend>>
The council already ranked him, $exfriendName. I'm explaining why the note fits.
If he hates it, he can use that full voice he found on day ten. 💅
<</actor>>
<<actor girlfriend>>
$youName, don't read the group chat before bed.
Show up on presentation day with the handouts and a black shirt.
I'll handle the talking. You handle the printing and the not-clinking. 😘
<</actor>>
<<actor-thought you>>
Your field correction will sit under your name in front of the class.
The cage still aches when you picture $bestfriendName finding one more chance to load her private draft.
<</actor-thought>>
<</if>>
</div>
<section class="phone-nav">
<a data-passage="Phone chats" class="phone-back-btn link-internal">Chats</a>
</section>
</div>
<</nobr>><<nobr>>
<<set $flags.presentationMorningRead = true>>
<div class="phone" id="filterSuper">
<div class="topHeader">
<div>
<span id="timeCurrent"><<print $gameDate.getHours() + ':00'>> </span>
<i class="fa-brands fa-whatsapp fa-xl"></i>
</div>
</div>
<div class="messages">
<img class="centered" @src="setup.ImagePath+'story/owned/day40-class-arrival.jpg'" alt="the group preparing for presentation day">
<<actor girlfriend>>
Today: Black shirt, handouts in your bag.
Your corrected notes are in the deck. Answer the field question when I pass it to you. 😘
<</actor>>
<<actor bestfriend>>
<<if $flags.day37SlideDecision eq "warn">>The room is ready. Your approved deck survived. Boring, but ready.<<else>>The room is ready. My private version is still better.<</if>>
Are you? 🤭
<</actor>>
<<actor bully>>
Field expert's big day. Never thought I would type that. 😂
Someone make sure $bestfriendName cannot edit after we start.
<</actor>>
<<actor girlfriend>>Nobody adds or photographs private material. This is a graded presentation.<</actor>>
<<actor bestfriend>>
I love calling this "documentation." 💀
<</actor>>
<<actor-thought you>>
You check the black shirt, the handouts, and the corrected notes. The cage is already tight against your thigh.
The field answer is yours. <<if $flags.day37SlideDecision eq "warn">>$girlfriendName locked the approved deck herself.<<else>>The edit-history photo on your phone is the only proof of what $bestfriendName changed.<</if>>
<</actor-thought>>
</div>
<section class="phone-nav">
<a data-passage="Phone chats" class="phone-back-btn link-internal">Chats</a>
</section>
</div>
<</nobr>><<nobr>>
<<set _gReady = setup.goddessHomeworkReady()>>
<<set _eReady = setup.edgeReportReady()>>
<div class="phone-shell">
<div class="phone-shell-top">
<span class="phone-shell-time"><<print $gameDate.getHours()>>:00</span>
<span class="phone-shell-title">Tasks</span>
<span class="phone-shell-icons" aria-hidden="true">▮▮▮</span>
</div>
<div class="phone-tasks-body">
<p class="phone-home-label">Keyholder assignments</p>
<p class="phone-home-hint">Edge: Mon & Wed · Clip: Tue & Thu</p>
<p class="phone-home-hint">Caption set: <<= setup.captionStoryProgressLabel()>> · clean Edge Report = next Snap</p>
<<if setup.isJennyTaskDay()>>
<p class="phone-home-hint">Today: <<= setup.jennyTaskDayLabel()>></p>
<<else>>
<p class="phone-home-hint">Next, <<= setup.jennyTaskDayLabel()>></p>
<</if>>
<<if _gReady>>
<a data-passage="Goddess homework" class="chat-link link-internal" tabindex="0">
<div class="chat-row is-new task-row">
<div class="chat-avatar tool-avatar">🎬</div>
<div class="chat-row-main">
<div class="chat-row-top">
<span class="chat-row-name">Clip homework</span>
<span class="chat-pill">due</span>
</div>
<div class="chat-row-preview">Goddess clip · sound on · once each · rate 1–10</div>
</div>
</div>
</a>
<<elseif $flags.goddessPlaylistComplete>>
<div class="chat-row task-row task-done">
<div class="chat-avatar tool-avatar">✓</div>
<div class="chat-row-main">
<div class="chat-row-top"><span class="chat-row-name">Clip homework</span></div>
<div class="chat-row-preview">Playlist complete<<if setup.goddessBestClipIndex() neq null>> · #1 is clip <<= setup.goddessBestClipIndex()>><</if>></div>
</div>
</div>
<<elseif $caged && ($flags.keyRulesDone || $flags.nightOutSmellDone) && setup.genreHas("vesperina")>>
<div class="chat-row task-row">
<div class="chat-avatar tool-avatar">🎬</div>
<div class="chat-row-main">
<div class="chat-row-top"><span class="chat-row-name">Clip homework</span></div>
<div class="chat-row-preview"><<if setup.isJennyClipDay()>>Done for today<<else>>Tue & Thu only<</if>> · <<= setup.goddessClipsLeft()>> left</div>
</div>
</div>
<<else>>
<div class="chat-row task-row task-locked">
<div class="chat-avatar tool-avatar">🎬</div>
<div class="chat-row-main">
<div class="chat-row-top"><span class="chat-row-name">Clip homework</span></div>
<div class="chat-row-preview">Unlocks after cage + key rules</div>
</div>
</div>
<</if>>
<<if _eReady>>
<a data-passage="Edge report start" class="chat-link link-internal" tabindex="0">
<div class="chat-row is-new task-row">
<div class="chat-avatar tool-avatar">🔒</div>
<div class="chat-row-main">
<div class="chat-row-top">
<span class="chat-row-name">Edge Report</span>
<span class="chat-pill">due</span>
</div>
<div class="chat-row-preview">Mon & Wed · edge · phrase · streak</div>
</div>
</div>
</a>
<<elseif $caged && ($flags.keyRulesDone || $flags.nightOutSmellDone)>>
<div class="chat-row task-row">
<div class="chat-avatar tool-avatar">🔒</div>
<div class="chat-row-main">
<div class="chat-row-top"><span class="chat-row-name">Edge Report</span></div>
<div class="chat-row-preview"><<if setup.isJennyEdgeDay()>>Done for today<<else>>Mon & Wed only<</if>> · streak <<= $edgeStreak>></div>
</div>
</div>
<<else>>
<div class="chat-row task-row task-locked">
<div class="chat-avatar tool-avatar">🔒</div>
<div class="chat-row-main">
<div class="chat-row-top"><span class="chat-row-name">Edge Report</span></div>
<div class="chat-row-preview">Unlocks after cage + key rules</div>
</div>
</div>
<</if>>
<<if !_gReady && !_eReady>>
<<if setup.isJennyTaskDay()>>
<p class="phone-home-hint">Nothing open for today. <<= setup.jennyTaskDayLabel()>></p>
<<else>>
<p class="phone-home-hint">No due tasks. Edge: Mon/Wed · Clip: Tue/Thu.</p>
<</if>>
<</if>>
</div>
<div class="phone-shell-bottom">
[[Home screen|Phone]]
<<set _phoneClose = setup.phoneCloseDestination()>><<link "Close" _phoneClose>><<set $phoneOrigin = "">><</link>>
</div>
</div>
<</nobr>>
/* Legacy name: overnight pings now live in Snap (include so content renders same turn) */<<nobr>>
<<include "Phone snap">>
<</nobr>><<nobr>>
/* Priority: bully pics first (independent of Jenny), then caption story, then overnight text.
Jamal must not wait behind a Jenny overnight ping. */
<<set _snapMore = (setup.bullySnapCount() + setup.captionUnreadCount() + ($flags.phoneOvernightPending ? 1 : 0))>>
<div class="phone-shell phone-snap-shell">
<div class="phone-shell-top phone-snap-top">
<span class="phone-shell-time"><<print $gameDate.getHours()>>:00</span>
<span class="phone-snap-brand"><span class="phone-snap-ghost" aria-hidden="true">👻</span> Snap</span>
<span class="phone-shell-icons" aria-hidden="true">▮▮▮</span>
</div>
<div class="phone-snap-body">
<<if setup.bullySnapCount() gt 0>>
/* Bully hallway snaps first — not gated on Jenny */
<<set _bSnap = setup.popBullySnap()>>
<<if _bSnap>>
<<print setup.renderSnapThread("bully", _bSnap.text, _bSnap.imgUrl)>>
<<run setup.nudgeArousal(10)>>
<<else>>
<div class="phone-snap-empty"><div class="phone-app-icon phone-app-icon-snap phone-app-icon-snap-lg" aria-hidden="true">👻</div><p class="phone-home-label">No new snaps</p></div>
<</if>>
<<elseif setup.captionUnreadCount() gt 0>>
/* Jenny caption story (Edge Report obey) */
<<set _capId = setup.popCaptionUnread()>>
<<if _capId>>
<<run setup.unlockCaption(_capId)>>
<<set _snapText = setup.snapPicTag()>>
<<print setup.renderSnapThread("girlfriend", _snapText, setup.captionURL(_capId))>>
<<run setup.nudgeArousal(8)>>
<<else>>
<div class="phone-snap-empty"><div class="phone-app-icon phone-app-icon-snap phone-app-icon-snap-lg" aria-hidden="true">👻</div><p class="phone-home-label">No new snaps</p></div>
<</if>>
<<elseif $flags.phoneOvernightPending>>
/* Text overnight (Jenny / Alessia) after pic queues */
<<set $flags.phoneOvernightPending = false>>
<<set $flags.phoneOvernightRead = true>>
<<set _snap = setup.pickOvernightSnap()>>
<<print setup.renderSnapThread(_snap.role, _snap.text, _snap.imgUrl)>>
<<if $caged>>
<<run setup.nudgeArousal(8)>>
<</if>>
<<else>>
<div class="phone-snap-empty"><div class="phone-app-icon phone-app-icon-snap phone-app-icon-snap-lg" aria-hidden="true">👻</div><p class="phone-home-label">No new snaps</p></div>
<</if>>
<<set _snapLeft = setup.bullySnapCount() + setup.captionUnreadCount() + ($flags.phoneOvernightPending ? 1 : 0)>>
<<if _snapLeft gt 0>>
<div class="phone-snap-more">
<a data-passage="Phone snap" class="phone-snap-next link-internal" tabindex="0">Next · <<= _snapLeft >> left</a>
</div>
<</if>>
</div>
<div class="phone-shell-bottom phone-snap-bottom">
<a data-passage="Phone" class="link-internal" tabindex="0">Apps</a>
<a data-passage="Home" class="link-internal" tabindex="0">Close</a>
</div>
</div>
<</nobr>>
/* Legacy: caption DMs used to open here → Snap */<<nobr>>
<<include "Phone snap">>
<</nobr>><<nobr>>
<<run setup.applyFavorGalleryBonus()>>
<<run setup.ensureGalleryState()>>
/* Album only — new pics open in Snap (do not clear captionUnread here) */
<div class="phone-shell phone-gallery-shell">
<div class="phone-shell-top">
<span class="phone-shell-time"><<print $gameDate.getHours()>>:00</span>
<span class="phone-shell-title">Gallery</span>
<span class="phone-shell-icons" aria-hidden="true">▮▮▮</span>
</div>
<div class="phone-gallery-body">
<<if ($gallery || []).length gt 0>>
<p class="phone-gallery-count"><<= ($gallery || []).length >> photo<<= ($gallery || []).length gt 1 ? "s" : "">></p>
<div class="phone-gallery-grid">
<<for _gi = 0; _gi lt $gallery.length; _gi++>>
<<set _gid = $gallery[_gi]>>
<<set _gmeta = setup.captionMeta(_gid)>>
<<set _gtitle = _gmeta ? _gmeta.title : _gid>>
<<set _gurl = setup.captionURL(_gid)>>
<<capture _gid, _gurl, _gtitle>>
<div class="phone-gallery-cell"><<print '<img class="phone-gallery-thumb" src="' + _gurl + '" alt="">'>><<link `"Open " + _gtitle` "Phone gallery view">><<set $galleryViewId = _gid>><</link>></div>
<</capture>>
<</for>>
</div>
<<else>>
<div class="phone-gallery-empty">
<p class="phone-home-label">No photos</p>
<p class="phone-home-hint">Clean Edge Reports unlock $girlfriendName's caption set as Snaps. They save here.</p>
</div>
<</if>>
</div>
<div class="phone-shell-bottom">
[[Home screen|Phone]]
<<set _phoneClose = setup.phoneCloseDestination()>><<link "Close" _phoneClose>><<set $phoneOrigin = "">><</link>>
</div>
</div>
<</nobr>><<nobr>>
<<run setup.ensureGalleryState()>>
<<if !$galleryViewId || !setup.captionMeta($galleryViewId)>>
<div class="phone-shell"><div class="phone-shell-body"><p class="phone-empty">This photo isn't available.</p><div class="phone-footer"><<link "Apps" "Phone">><</link>><<link "Gallery" "Phone gallery">><</link>></div></div></div>
<<else>>
<<set _gmeta = setup.captionMeta($galleryViewId)>>
<<set _gurl = setup.captionURL($galleryViewId)>>
<div class="phone-shell phone-gallery-shell phone-gallery-view-shell">
<div class="phone-shell-top">
<span class="phone-shell-time"><<print $gameDate.getHours()>>:00</span>
<span class="phone-shell-title">Photo</span>
<span class="phone-shell-icons" aria-hidden="true">▮▮▮</span>
</div>
<div class="phone-gallery-view-body">
<<print '<img class="phone-gallery-full" src="' + _gurl + '" alt="">'>>
<<if _gmeta>>
<p class="phone-gallery-view-title"><<= _gmeta.title>></p>
<</if>>
</div>
<<set $aroused = $aroused gte 95 ? 100 : $aroused + 5>>
<div class="phone-shell-bottom">
[[Gallery|Phone gallery]]
[[Home screen|Phone]]
<<set _phoneClose = setup.phoneCloseDestination()>><<link "Close" _phoneClose>><<set $phoneOrigin = "">><</link>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<run setup.markClassRankingSeen()>>
<<set _rank = setup.getClassRanking()>>
<div class="phone-shell phone-ranks-shell">
<div class="phone-shell-top">
<span class="phone-shell-time"><<print $gameDate.getHours()>>:00</span>
<span class="phone-shell-title">Ranks</span>
<span class="phone-shell-icons" aria-hidden="true">▮▮▮</span>
</div>
<div class="phone-ranks-body">
<<if !_rank.unlocked>>
<p class="phone-home-hint">No provisional list yet. Council hasn't posted.</p>
<<else>>
<<include "Class rank list body">>
<p class="phone-home-hint">Public recognition. Same list on the school board.</p>
<</if>>
</div>
<div class="phone-shell-bottom">
[[See school board|Class board]]
[[Home screen|Phone]]
<<set _phoneClose = setup.phoneCloseDestination()>><<link "Close" _phoneClose>><<set $phoneOrigin = "">><</link>>
</div>
</div>
<</nobr>><<nobr>>
<div class="phone-shell phone-patreon-shell">
<div class="phone-shell-top">
<span class="phone-shell-time"><<print $gameDate.getHours()>>:00</span>
<span class="phone-shell-title">Patreon</span>
<span class="phone-shell-icons" aria-hidden="true">▮▮▮</span>
</div>
<div class="phone-patreon-body">
<div class="phone-patreon-hero">
<div class="phone-app-icon phone-app-icon-patreon phone-app-icon-patreon-lg" aria-hidden="true">P</div>
</div>
<p class="phone-home-label">Support the game</p>
<p class="phone-home-hint">v<<= setup.GAME_VERSION>>: builds land on Patreon first.</p>
<ul class="phone-patreon-bullets">
<li>New builds for paid tiers before free mirrors</li>
<li>Bug reports get priority by tier</li>
<li>Public demos stay free later</li>
</ul>
<<if setup.SUPPORTER_CREDITS && setup.SUPPORTER_CREDITS.length>>
<section class="phone-supporter-credits">
<div class="phone-supporter-heading">
<div>
<p class="phone-supporter-eyebrow">Community credits</p>
<p class="phone-supporter-title">Patreon contributors</p>
</div>
<span class="phone-supporter-count"><<= setup.SUPPORTER_CREDITS.length>></span>
</div>
<p class="phone-home-hint phone-supporter-thanks">Thank you for helping fund the next chapter.</p>
<<= setup.supporterCreditsHTML()>>
</section>
<</if>>
<p class="phone-home-label">Clip credit</p>
<p class="phone-home-hint">Clip homework shoutout: <strong><<= setup.VESPERINA_CREDIT>></strong>. Some AI clips in that pack are built from her work. Local files only, not hotlinked.</p>
<p class="phone-home-hint">Opens in your browser (real site, not in-game).</p>
<div class="phone-patreon-actions">
<<link "Open Patreon">><<run setup.openPatreon()>><</link>>
<<link "Goddess Vesperina">><<run setup.openVesperina()>><</link>>
</div>
</div>
<div class="phone-shell-bottom">
[[Home screen|Phone]]
<<set _phoneClose = setup.phoneCloseDestination()>><<link "Close" _phoneClose>><<set $phoneOrigin = "">><</link>>
</div>
</div>
<</nobr>><<nobr>>
<<set $flags.resultsLiveSeen = true>>
<<set $flags.questHint = "">>
<div class="phone" id="filterSuper">
<div class="topHeader">
<div>
<span id="timeCurrent"><<print $gameDate.getHours() + ':00'>> </span>
<i class="fa-brands fa-whatsapp fa-xl"></i>
</div>
</div>
<div class="messages">
<<include "ANWO results live chat">>
</div>
<section class="phone-nav">
<a data-passage="Phone chats" class="phone-back-btn link-internal">Chats</a>
</section>
</div>
<</nobr>><<nobr>>
<<actor exfriend>>
Okay, the packet went up.
$teacherName shared a summary with student council.
"Significant results" means they're actually reading it.
<</actor>>
<<actor bestfriend>>
LMAO, council actually read it.
$youName already looks like he's about to confess again. 🤭
<</actor>>
<<actor bully>>
If council likes the numbers we look smart.
If they don't, we blame the guy who ran field interviews 😂
<</actor>>
<<actor girlfriend>>
Don't spiral in the chat.
If anyone asks at school, we give the same answer.
I'm not fixing another public panic.
<</actor>>
<<actor-thought you>>
She is already planning what you are allowed to say at school. The PDF is out of your hands now.
<</actor-thought>>
<<actor you>>
So council has it now. This can actually go somewhere.
<</actor>>
<<actor exfriend>>
Yep, so smile in class and don't be weird.
<</actor>>
<</nobr>><<nobr>>
<<set $flags.googledSissy = true>>
<<set $flags.questHint = "">>
<p class="delayed">The first result gives you a definition. The image tab is all short skirts, stockings, makeup, and men posing for the camera.</p>
<div class="delayed">
<img @src="setup.ImagePath+'phone/sissy1.webp'" class="centered">
</div>
<div class="delayed">
<img @src="setup.ImagePath+'phone/sissy2.jpeg'" class="centered">
</div>
<<actor-thought you>>
I only needed the definition. Why did I open the images? I should ask the group what $teacherName meant before they hear about this from someone else.
<</actor-thought>>
[[Home screen|Phone]]
[[Chats|Phone chats]]
<</nobr>><<nobr>>
<<set $flags.mallRiskDone = true>>
<img class="centered" @src="setup.ImagePath+'places/mall.png'">
<p class="delayed">
Inside the changing room, you reach through your jeans to adjust the cage without thinking.
Then you notice the curtain has slipped several inches open.
</p>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'stores/xxx-store.png'"><div><span class="name-container"><span class="name">Clerk</span></span><span class="content">You good in there? Need a different size or...?</span></div></div>
<<actor-thought you>>
The cage scrapes against the denim. Your fingers miss the zipper once. If the clerk pulls the curtain aside, they will see exactly how ANWO has changed your private life.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "I am fine! Just... shoe.">>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'stores/xxx-store.png'"><div><span class="name-container"><span class="name">Clerk</span></span><span class="content">Uh-huh. Take your time, man.</span></div></div>
<<actor-thought you>>
Maybe they saw and decided not to say anything. Your hands keep shaking long after you leave the changing room.
<</actor-thought>>
<<run setup.nudgeArousal(8)>>
<div class="delayed">[[Leave the store|Mall]]</div>
<</you-choice>>
<<you-choice "Freeze. Say nothing.">>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'stores/xxx-store.png'"><div><span class="name-container"><span class="name">Clerk</span></span><span class="content">...Okay. Weird energy. I will be at the counter.</span></div></div>
<<run setup.nudgeArousal(10)>>
<div class="delayed">[[Escape to mall hall|Mall]]</div>
<</you-choice>>
</div>
<</nobr>><<nobr>>
<<set $flags.schoolKeyRiskDone = true>>
<<run setup.applyRecognition("owned-school-key-flash")>>
<p class="delayed">
Hallway crush before second period. $girlfriendName digs in her bag for lip gloss.
The key on her ring catches light, small, silver, unmistakable if you know what you are looking at.
</p>
<<actor bestfriend>>
Cute keychain. New?
Wait... is that for *him*?
<</actor>>
<<actor girlfriend>>
Mm. Someone has to be responsible for him.
<</actor>>
<<if setup.isEager()>>
<<actor-thought you>>
You want them to figure it out. Heat climbs your neck when $bestfriendName's eyes move from the key to your jeans.
<</actor-thought>>
<<elseif setup.isResist()>>
<<actor-thought you>>
You want to snatch it. You do not. Your jaw hurts from not speaking.
<</actor-thought>>
<<else>>
<<actor-thought you>>
You smile and nod as if it were a locker key, then wait for the bell to end the conversation.
<</actor-thought>>
<</if>>
<<actor bully>>
You look like you're about to pass out. You good, man?
<</actor>>
<<actor you>>
Fine.
<</actor>>
<<actor bestfriend>>
He is definitely not fine. Look at him. This is better than TV.
<</actor>>
<<actor girlfriend>>
He is fine. I manage him. Don't help, $bestfriendName.
<</actor>>
<<actor bestfriend>>
I'm not helping. I just want everyone to see his face.
<</actor>>
<<run setup.nudgeArousal(8)>>
<div class="delayed">
[[To class|School]]
</div>
<</nobr>><<nobr>>
<<set $flags.phoneLeakScareDone = true>>
<<actor sister>>
Sleep well, or did the cage keep pinching?
<</actor>>
<<actor sister>>
Reminder: I still have those panty pics. Group chat would die. $girlfriendName would... actually she might thank me.
Be useful. Stay cute. Do not test me this week.
<</actor>>
<<if setup.isResist()>>
<<actor-thought you>>
She smiles while threatening you. You remember every word for the next time she asks for a favor.
<</actor-thought>>
<<else>>
<<actor-thought you>>
Your stomach drops. Doing what she asks is easier than having those photos sent around school.
<</actor-thought>>
<</if>>
<div class="delayed">
[[Home]]
</div>
<</nobr>><<nobr>>
<<set _rank = setup.getClassRanking()>>
<<if !_rank.unlocked>>
<p class="hint-line">No list yet. Council hasn't posted names.</p>
<<else>>
<div class="class-rank-block">
<p class="class-board-heading"><<= _rank.title>></p>
<p class="hint-line class-rank-note"><<= _rank.note>></p>
<div class="class-rank-table" role="list">
<<for _ri = 0; _ri lt _rank.rows.length; _ri++>>
<<set _row = _rank.rows[_ri]>>
<div role="listitem" @class="'class-rank-row' + (_row.isYou ? ' is-you' : '') + (_row.isAlpha ? ' is-alpha' : ' is-beta')"><span class="class-rank-num">#<<= _row.rank>></span><span class="class-rank-name"><<= _row.name>><<if _row.isYou>> <em>(you)</em><</if>><<if _row.tag neq "">> <span class="class-rank-tag"><<= _row.tag>></span><</if>></span><span class="class-rank-band"><<= _row.band>></span></div>
<</for>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<run setup.markClassRankingSeen()>>
<div class="scene-panel compact class-board-panel">
<img class="hero-img centered" @src="setup.ImagePath+'story/act1/class-rank-board.jpg'" alt="Alpha Beta ranking board">
<h2 class="scene-title">Ranking board</h2>
<p class="scene-lead">Posted by the office. This is public recognition, based on what the council records and everyone sees.</p>
<<include "Class rank list body">>
<div class="hub-actions">
<<if setup.isSchoolHours()>>
[[Go to class|School]]
<</if>>
[[Leave campus|After school]]
<<if setup.classRankingUnlocked()>>
[[Phone copy|Phone ranks]]
<</if>>
[[Home]]
</div>
</div>
<</nobr>><<nobr>>
<div id="conv">
<img class="hero-img centered" @src="setup.ImagePath+'places/school.jpg'" alt="school exterior">
<p class="scene-lead">First morning. New hallways, the same face you can't stop looking at.</p>
<<if !hasVisited("relationshipState-initial")>>
<div class="continue-links">[[Continue|relationshipState-initial]]</div>
<<else>>
<div class="continue-links">[[Continue|relationshipState-known]]</div>
<</if>>
</div>
<</nobr>><<nobr>>
<div id="conv">
<img class="hero-img centered" @src="setup.ImagePath+'places/school.jpg'" alt="school exterior">
<p class="scene-lead">Morning again. The hallways are the same, but everything else changed overnight.</p>
<<set $passageName = 'relationshipState-' + $relationshipState>>
<<if tale.has($passageName) && !hasVisited($passageName)>>
<div class="continue-links">[[Continue|$passageName]]</div>
<<elseif $caged && !$flags.schoolKeyRiskDone && $schoolDay gte 25 && random(1, 2) eq 1>>
[[Continue|Risk school key flash]]
<<else>>
<<run setup.nudgeArousal(8)>>
<img @src="setup.ImagePath+'school/gf'+ random(1, 5) +'.jpeg'" class="centered">
<<if $flags.wearingUsedPanty && $caged>>
<img class="hero-img centered delayed" @src="setup.ImagePath+'story/hustles/used-panty-worn.jpg'" alt="her panties under school clothes">
<<actor-thought you>>
Her used pair from his night sits under your clothes. With every step, the fabric rubs against the cage and brings the assignment back to mind.
<</actor-thought>>
<<if $girlfriendTrustLevel gte 6>>
<<actor girlfriend>>
Walk normal.
I know what you're wearing. Don't make it loud.
<</actor>>
<<else>>
<<actor girlfriend>>
Those panties stay on.
If you fidget I'll notice.
<</actor>>
<</if>>
<<run setup.nudgeArousal(8)>>
<</if>>
<<if $backpack.has("apology-gift") && !$flags.giftDelivered>>
<<actor you>>Hey... I got you something.<</actor>>
<<actor girlfriend>>Oh? Bribery before first period?<</actor>>
<p class="delayed">She opens the black box, runs a thumb over the silver bracelet, then slips it into her bag with a small smile.</p>
<<if $caged>>
<<actor girlfriend>>Thank you, baby. Keep this up and maybe I let you out a little longer next time.<</actor>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 2)>>
<<else>>
<<actor girlfriend>>Thanks, honey. You're sweet when you try.<</actor>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<</if>>
<<drop $backpack "apology-gift" 1>>
<<set $flags.giftDelivered = true>>
<<elseif $aroused gte 70>>
<<actor you>>Morning...$girlfriendName... I, uh, I missed you. A lot.<</actor>>
/* High arousal still respects GF favor, zero favor ≠ soft "baby" */
<<if $caged && $girlfriendTrustLevel lte 3>>
<<actor girlfriend>>I can tell. Your face is red and you're staring again. Don't cling to me. Get to class.<</actor>>
<<elseif $caged && $girlfriendTrustLevel lte 5>>
<<actor girlfriend>>Yeah, I see it. Cage isn't fixing your brain. Stop staring and get to class.<</actor>>
<<elseif $caged>>
<<actor girlfriend>>I can tell. Your face is red and that little cage is doing nothing for your brain. Focus on class, baby.<</actor>>
<<elseif $girlfriendTrustLevel lte 3>>
<<actor girlfriend>>You're flushed and weird. Don't make it my problem. Go.<</actor>>
<<elseif ($alphaBeta || 0) gte 4>>
<<actor girlfriend>>You're practically vibrating. Try to hold it together until we're out of the hallway.<</actor>>
<<else>>
<<actor girlfriend>>Whoa, easy. Save that energy for later, okay?<</actor>>
<</if>>
<<elseif $caged>>
/* Girlfriend favor: high = soft keyholder, low = cold keyholder */
<<if $girlfriendTrustLevel lte 3>>
<<actor you>>Morning...<</actor>>
<<actor girlfriend>>Walk. Don't talk. Don't make me explain the cage to anyone.<</actor>>
<<elseif setup.isEager()>>
<<actor you>>Morning... still locked for you.<</actor>>
<<if $girlfriendTrustLevel gte 7>>
<<actor girlfriend>>I know. I checked the key this morning. Don't embarrass me.<</actor>>
<<else>>
<<actor girlfriend>>I checked the key. Behave.<</actor>>
<</if>>
<<elseif setup.isResist()>>
<<actor you>>Morning. The... thing is still on.<</actor>>
<<if $girlfriendTrustLevel lte 5>>
<<actor girlfriend>>That face again. The cage stays on, so deal with it.<</actor>>
<<else>>
<<actor girlfriend>>Don't make that face in public. It stays on.<</actor>>
<</if>>
<<else>>
<<set $randomResponse = random(1, 3)>>
<<switch $randomResponse>>
<<case 1>>
<<actor you>>Morning, love. The... thing is still on.<</actor>>
<<if $girlfriendTrustLevel lte 5>>
<<actor girlfriend>>Mm, you're still locked and the key is still mine, so don't test me today.<</actor>>
<<elseif $cageAcceptance eq "reluctant">>
<<actor girlfriend>>I know. You agreed. Don't make that face in public.<</actor>>
<<else>>
<<actor girlfriend>>Mm-hmm. Key's with me. Have a good day.<</actor>>
<</if>>
<<case 2>>
<<actor girlfriend>>Walk normal. Nobody needs to know what's under your clothes except me.<</actor>>
<<actor you>>I am walking normal...<</actor>>
<<if $girlfriendTrustLevel gte 7>>
<<actor girlfriend>>You're walking like everyone can tell. Relax. See you later.<</actor>>
<<else>>
<<actor girlfriend>>You're walking like a secret. Fix it. See you later.<</actor>>
<</if>>
<<case 3>>
<<actor you>>Have a wonderful day, babe.<</actor>>
<<if $girlfriendTrustLevel lte 5>>
<<actor girlfriend>>Behave today. I'm still watching you.<</actor>>
<<else>>
<<actor girlfriend>>You too. Be good for me.<</actor>>
<</if>>
<</switch>>
<</if>>
<<elseif $girlfriendTrustLevel lte 5>>
<<actor you>>Morning, sweetheart...<</actor>>
<<actor girlfriend>>Morning. Don't make me regret keeping you. We'll talk later.<</actor>>
<<elseif ($alphaBeta || 0) gte 4>>
<<set $randomResponse = random(1, 2)>>
<<switch $randomResponse>>
<<case 1>>
<<actor you>>Good morning, love.<</actor>>
<<actor girlfriend>>Morning, soft boy. Try not to melt before lunch.<</actor>>
<<case 2>>
<<actor girlfriend>>There's my helpful boyfriend. Keep being useful today, okay?<</actor>>
<<actor you>>I... yeah. Of course. /* prose-ok: nervous speech */<</actor>>
<</switch>>
<<else>>
<<set $randomResponse = random(1, 4)>>
<<switch $randomResponse>>
<<case 1>>
<<actor you>>Morning, love. I'll text you after class.<</actor>>
<<actor girlfriend>>You better. I'll miss you.<</actor>>
<<case 2>>
<<actor you>>Morning, sweetheart. Can we do something together soon?<</actor>>
<<actor girlfriend>>Yeah, let's plan it later. See you.<</actor>>
<<case 3>>
<<actor you>>Have a good day, love. Kiss for later.<</actor>>
<<actor girlfriend>>Kiss back. See you tomorrow?<</actor>>
<<case 4>>
<<actor you>>Have a good day, babe. I already miss you a little.<</actor>>
<<actor girlfriend>>A little? Rude. I'll miss you too.<</actor>>
<</switch>>
<</if>>
/* Big tease only when ranks just changed (new stage since last view) */
<<if setup.classRankingHasUpdate()>>
<div class="quest-banner class-board-tease">
<strong>Ranking board updated</strong>
<p>The office list moved, drawing a cluster of students who no longer pretend they aren't looking.</p>
[[Check the ranking board|Class board]]
</div>
<</if>>
/* School-day paid hustles: before class (bags / used panties) */
<<if setup.hustleHubOpen() && setup.hustleGlobalReady()>>
<<set _mHustles = setup.hustleOpenSchoolList("morning")>>
<<if _mHustles.length gt 0>>
<p class="delayed hint-line">Before class, someone wants a “favor.” Cash if you play along.</p>
<div class="continue-links">
<<for _mi = 0; _mi lt _mHustles.length; _mi++>>
<<set _mh = _mHustles[_mi]>>
<<capture _mh>>
<<link `"Before class: " + _mh.title + " ($" + _mh.pay + ")"` _mh.passage>>
<<set $flags.hustleFromSchool = "morning">>
<</link>>
<</capture>>
<</for>>
<<if setup.classRankingHasUpdate()>>[[Ranking board (updated)|Class board]]<</if>>
[[Just go to class|School]]
</div>
<<else>>
<div class="continue-links">
<<if setup.classRankingHasUpdate()>>[[Ranking board (updated)|Class board]]<</if>>
[[School |School]]
</div>
<</if>>
<<else>>
<div class="continue-links">
<<if setup.classRankingHasUpdate()>>[[Ranking board (updated)|Class board]]<</if>>
[[School |School]]
</div>
<</if>>
<</if>></div>
<</nobr>><<nobr>>
<<masteraudio stop>>
/* Resolve the earliest incomplete authored milestone, regardless of an old save's day counter. */
<<set _lateMilestone = setup.nextLateSchoolMilestone()>>
<<set _catchup = _lateMilestone ? _lateMilestone.passage : "">>
<<if _catchup neq "">>
<<set _catchupLabel = _lateMilestone.direct ? "Hear the council result" : "Continue the school day">>
<div class="scene-panel compact">
<p class="scene-lead"><<if _lateMilestone.direct>>The council result is still waiting before you leave.<<else>>An unfinished school milestone is waiting for this save.<</if>></p>
<div class="continue-links"><<link _catchupLabel _catchup>><<set $schoolDay = Math.max($schoolDay || 0, (_lateMilestone.day || 0) + 1)>><</link>></div>
</div>
<</if>>
<<set _keyWeekSchool = _catchup eq "" ? setup.alessiaKeySchoolPassage() : "">>
/* The settled No-Alpha route keeps ordinary school playable without entering Alpha-dependent Days 35-40. */
<<if _keyWeekSchool neq "">>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'places/school.jpg'" alt="school exterior">
<p class="scene-lead">A scheduled conversation is waiting before the ordinary school loop.</p>
<div class="continue-links"><<link "Continue the school day" _keyWeekSchool>><</link>></div>
</div>
<<elseif _catchup eq "" && $world eq "anwo" && $schoolDay gte 35 && $flags.noAlphaBoundary && $flags.noAlphaRelationshipDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'places/school.jpg'" alt="school exterior">
<p class="scene-lead">The project group moves on without turning your relationship boundary into another presentation. Ordinary classes continue.</p>
<div class="continue-links">[[Continue the school week|School week loop]]</div>
</div>
/* Do not let late presentation beats outrun the permanent-rules morning. */
<<elseif _catchup eq "" && $world eq "anwo" && $schoolDay gte 35 && !$flags.ownedMorningAfterDone>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'places/school.jpg'" alt="school exterior">
<p class="scene-lead">The final project meetings have moved ahead, but $girlfriendName's permanent rules are still waiting at home. Finish that morning before the late presentation sequence continues.</p>
<div class="continue-links">[[Go home|Home]]</div>
</div>
/* Jump past empty calendar days so every school visit is a real beat */
<<elseif _catchup eq "">>
<<set _startDay = $schoolDay>>
<<set $schoolDay = setup.nextStorySchoolDay($world, $schoolDay)>>
<<set $passageName = 'School ' + $schoolDay + ' Day ' + $world>>
<<if tale.has($passageName)>>
<img class="hero-img centered" @src="setup.ImagePath+'places/school.jpg'" alt="school exterior">
<p class="scene-lead">Another school day. The hallways hum with the same energy.</p>
/* If we skipped multiple days, show the weekly loop first */
<<if $schoolDay - _startDay gt 1 && $world eq "anwo" && $schoolDay gte 26>>
<<set $schoolDay = _startDay>>
<div class="continue-links">[[School week loop|School week loop]]</div>
<<else>>
<div class="continue-links">[[Continue|$passageName][$schoolDay += 1]]</div>
<</if>>
<<else>>
<img @src="setup.ImagePath+'you/bored'+ random(1, 3) +'.jpeg'" class="centered">
<<if $world eq "anwo">>
<<if $flags.finalRankingSeen && $schoolDay gte 40>>
<p class="scene-lead">The project cycle is over, but school and its live rankings continue.</p>
<div class="continue-links">[[Continue the school week|School week loop]]</div>
<<else>>
<p>No new lectures today, the hierarchy already took attendance in your head.</p>
<<set $schoolDay += 1>>
/* Quiet day still ends via After school (shoe / afternoon gigs) */
<div class="continue-links">[[Leave school|After school]]</div>
<</if>>
<<else>>
/* Normal world after day 2: no more real school beats. Funnel back to the mail door. */
<p class="scene-lead">Hallways feel copied. Same lockers. Same almost-wave that never lands.</p>
<<actor-thought you>>
Nothing changes. You walk the same halls, watch the same couple leave together, and come home with nothing to show for it.
That weird mail on your computer is the only thing that does not fit.
<</actor-thought>>
<<set $schoolDay += 1>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 6)>>
<div class="continue-links">
[[Go home to the Computer|Computer]]
[[Just go home|Home]]
</div>
<</if>>
<</if>>
<</if>>
/* Shared after-class beat: time jump + optional afternoon hustles (Alessia shoe, etc.) */
<</nobr>><<nobr>>
<<silently>>
/* Land after last period so schoolSlot: afternoon gigs are in hours */
<<if $gameDate.getHours() lt 13>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 6)>>
<</if>>
<<if $gameDate.getHours() lt 12 || $gameDate.getHours() gte 18>>
<<run setup.setGameHour(14, 0)>>
<</if>>
<</silently>>
<div class="scene-panel compact">
<img class="hero-img" @src="setup.ImagePath+'places/school.jpg'" alt="School exterior">
<h2 class="scene-title">After school</h2>
<p class="scene-lead">Bell's done. Bags, hall, sun on the steps outside campus.</p>
<<if setup.hustleHubOpen() && setup.hustleGlobalReady()>>
<<set _aHustles = setup.hustleOpenSchoolList("afternoon")>>
<<if _aHustles.length gt 0>>
<p class="hint-line">Someone wants a favor before you leave. Cash if you play along. Or just go.</p>
<div class="hub-actions">
<<for _ai = 0; _ai lt _aHustles.length; _ai++>>
<<set _ah = _aHustles[_ai]>>
<<capture _ah>>
<<link `"After school: " + _ah.title + " ($" + _ah.pay + ")"` _ah.passage>>
<<set $flags.hustleFromSchool = "afternoon">>
<</link>>
<</capture>>
<</for>>
<<if setup.classRankingHasUpdate()>>[[Ranking board (updated)|Class board]]<</if>>
[[Home]]
</div>
<<else>>
<div class="hub-actions">
<<if setup.classRankingHasUpdate()>>[[Ranking board (updated)|Class board]]<</if>>
[[Home]]
</div>
<</if>>
<<else>>
<div class="hub-actions">
<<if setup.classRankingHasUpdate()>>[[Ranking board (updated)|Class board]]<</if>>
[[Home]]
</div>
<</if>>
</div>
<</nobr>>
/* Shared exit after school-linked side hustles */<<nobr>>
<<if $flags.hustleFromSchool eq "morning">>
<<set $flags.hustleFromSchool = "">>
<div class="delayed continue-links">[[Continue to class|School]]</div>
<<elseif $flags.hustleFromSchool eq "afternoon">>
<<set $flags.hustleFromSchool = "">>
<div class="delayed continue-links">
[[Home]]
</div>
<<else>>
<div class="delayed continue-links">[[Home]]</div>
<</if>>
<</nobr>><<nobr>>
<div id="conv">
<<actor you>>Excuse?<</actor>>
<<actor bully>>
Yeah. It was a little bitter. You didn't taste it yet? I figured you might like it.
<</actor>>
<<actor you>>What?<</actor>>
<<actor girlfriend>>
A chocolate! Yeah... he gave me one for you yesterday.
<</actor>>
<<if $flags.noticedSmell>>
<<actor-thought you>>
The bitter taste went from him to her and then into your mouth. The whole timeline turns like a knife.
<</actor-thought>>
<<else>>
<<actor-thought you>>
$bullyName is smiling too wide. $girlfriendName's smile is perfect and wrong.
<</actor-thought>>
<</if>>
</div>
<span id='options'>
<<you-choice "Really? Can I have it?">>
<<actor girlfriend>>
Yeees, but I forgot it at home. How about I bring it tonight?
Or better, we continue where we left off yesterday?
<</actor>>
[[Sounds good to me 😏|School][$strokeState = "before-second-time-caught"; $aroused = 90]]
<</you-choice>>
<<you-choice "Keep it. I don't like chocolate.">>
<<actor girlfriend>>
Oh. Okay. I know something else you might like.
How about we continue where we left off yesterday?
<</actor>>
[[Sounds good to me 😏|School][$strokeState = "before-second-time-caught"; $aroused = 90]]
<</you-choice>>
<<if $flags.noticedSmell>>
<<you-choice "That wasn't chocolate.">>
<<actor girlfriend>>
Don't be gross in the hallway. Tonight. We'll talk with our mouths busy.
<</actor>>
<<actor bully>>
Relax, man, it's mostly a joke.
<</actor>>
[[School|School][$strokeState = "before-second-time-caught"; $aroused = Math.min(92, Math.max($aroused, 80)); $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1)]]
<</you-choice>>
<</if>>
</span>
<</nobr>><<nobr>>
<<set $flags.anniversaryTonight = true>>
<<run setup.peakArousal()>>
<img class="hero-img centered" @src="setup.ImagePath+'story/act2/anniversary-fountain.jpg'" alt="anniversary at the fountain">
<<actor girlfriend>>Hey, don't forget our anniversary at the fountain after school.<</actor>>
<<actor girlfriend>>I waited a whole year for a night that isn't homework and group chat. Tonight gets spicy. Don't make me wait alone.<</actor>>
<<actor-thought you>>
She said it soft, but her eyes said don't mess this up.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "I'll be there. Promise. 💖">>
<<actor girlfriend>>Good, and dress nice, or at least... try. [[School|School]]
<</actor>>
<</you-choice>>
<<you-choice "Spicy how? 😳">>
<<actor girlfriend>>If I tell you, you'll ruin it in the bathroom before I get there. Meet me at the fountain after class. [[School|School]]
<</actor>>
<</you-choice>>
</div>
<</nobr>><<nobr>>
<p class="scene-lead">You enter school expecting the hallway to look different. It does not.</p>
<<actor girlfriend>>
Hey, you're frozen. Breathe for me.
<</actor>>
<p class="delayed">$girlfriendName steps into your path, laces her fingers through yours, and keeps walking like nothing about that is strange.</p>
<<actor-thought you>>
Two days ago she kissed $exfriendName against these lockers. Now her hand is in mine like it never left.
<</actor-thought>>
<<actor girlfriend>>
You look like you didn't sleep.
<</actor>>
<<actor you>>
I barely slept. Sorry.
<</actor>>
<<actor girlfriend>>
Don't apologize for being tired. Just walk me to class before you pass out in the hall.
<</actor>>
<<if $flags.day1ExKissSeen>>
<<actor-thought you>>
She does not remember the kiss or the game. In this version of the morning, $exfriendName has always been the one outside the relationship.
<</actor-thought>>
<</if>>
<div class="continue-links">
[[Yeah. Sure.|School]]
</div>
<</nobr>><<nobr>>
<<masteraudio stop>>
<<if not settings.muteAudio>><<audio "have_eyes" play>><</if>>
<div class="scene-panel">
<p class="scene-lead">First morning at school. You spot <strong>$girlfriendName</strong> on the way into first period and look a second too long. By the time you face forward, you are already walking into her shoulder.</p>
<img @src="setup.ImagePath+'school/bump.png'" class="hero-img delayed" alt="">
<<actor girlfriend>>
Whoa. Watch where you're going.
<</actor>>
<<actor you>>
Sorry. I saw you and... sorry.
<</actor>>
<<actor girlfriend>>
Yeah, I got that part. You're fine. Just let me through.
<</actor>>
<<actor-thought you>>
You move aside. She is gone before you think of anything less embarrassing to say.
<</actor-thought>>
<div class="continue-links">
[[Continue to class|School]]
</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel">
<p class="scene-lead">The next morning, <strong>$girlfriendName</strong> passes you in the hall with $bestfriendName beside her.</p>
<img @src="setup.ImagePath+'school/bump.png'" class="hero-img delayed" alt="">
<<actor girlfriend>>
Hey. Try not to walk into anyone today.
<</actor>>
<<actor you>>
Yeah. You too.
<</actor>>
<<actor bestfriend>>
That was painful. She says one sentence and you forget how talking works.
<</actor>>
<<actor girlfriend>>
Leave him alone, $bestfriendName. Come on.
<</actor>>
<div class="continue-links">
[[Continue to class|School]]
</div>
</div>
<</nobr>><<nobr>>
<<actor girlfriend>>Are you serious?<</actor>>
<<actor girlfriend>>$girlfriendMadReason<</actor>>
<<if ($alphaBeta || 0) gte 4>>
<<actor girlfriend>>And after everything you've already given me? Really?<</actor>>
<<elseif $girlfriendTrustLevel lte 5>>
<<actor girlfriend>>I'm already this close to being done with your excuses.<</actor>>
<</if>>
<span id="conv"></span>
<div id="options">
<<you-choice "Sorry. I should have handled it better.">>
<<actor girlfriend>>
That is not much of an explanation.
<</actor>>
<<actor you>>
I know. I screwed up and made it your problem.
<</actor>>
<<if ($alphaBeta || 0) gte 4>>
<<actor girlfriend>>
At least you're honest. Weak, but honest. Don't make me clean up your mess again. [[School|School][$girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1)]]
<</actor>>
<<elseif $caged>>
<<actor girlfriend>>
You're locked and you still find ways to be a problem. Unbelievable. Bye. [[School|School][$girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 2)]]
<</actor>>
<<else>>
<<actor girlfriend>>
You are so weak-minded. Bye. [[School|School][$girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 2)]]
<</actor>>
<</if>>
<</you-choice>>
<<you-choice "No, I didn't do that">>
<<actor girlfriend>>
Hmm. Why should I believe you?
<</actor>>
<<actor you>>
Because I'm your boyfriend and I have no reason to lie.
<</actor>>
<<if $girlfriendTrustLevel gt 5>>
<<actor girlfriend>>
Okay. I believe you this time. Next time you will have a problem. [[School|School][$girlfriendTrustLevel = setup.changeFavor(-5)]]
<</actor>>
<<elseif ($alphaBeta || 0) gte 6 && $caged>>
<<actor girlfriend>>
Cute try. You're locked for a reason. Don't insult me with lies on top of it. [[School|School][$girlfriendTrustLevel = 0]]
<</actor>>
<<else>>
<<actor girlfriend>>
I don't trust you anymore. Stop lying! Grow some balls and own your actions. [[School|School][$girlfriendTrustLevel = 0]]
<</actor>>
<</if>>
<</you-choice>>
</div>
<</nobr>><<nobr>>
<span id="conv"></span>
<<set $relationshipState = "reset">>
<<actor girlfriend>>Hey, strokeboy. Hope the hand was worth blowing our anniversary.<</actor>>
<div id='options'>
<<you-choice "I'm sorry. I didn't mean to hurt you.">>
<<actor girlfriend>>
Okay. I accept the apology, once.
Tonight we continue where we should have started. Home. My rules.
<</actor>>
[[School |School][$strokeState = "before-second-time-caught"; $aroused = Math.min(92, Math.max($aroused, 80)); $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1)]]
<</you-choice>>
<<you-choice "I don't care. I don't owe you anything.">>
<<actor girlfriend>>Okay. That's it. We're done. /* prose-ok: breakup dialogue */<</actor>>
[[Bye |End lost girlfriend]]
<</you-choice>>
</div>
<</nobr>><<nobr>>
<<set $relationshipState = "reset">>
<p class="delayed">
You cut through the hall and spot $girlfriendName with $bullyName by the lockers. They're close, laughing like a private joke.
You hear her before they see you.
</p>
<<actor girlfriend>>...And then he ate it.<</actor>>
<<actor bully>>Wait... you didn't clean up first? And he didn't notice?<</actor>>
<<actor girlfriend>>No.<</actor>>
<span class="delayed">...</span>
<<actor bully>>
OH... hey, $youName! Sorry I wrecked your anniversary yesterday. I didn't mean to.
I gave her something, though. Like an excuse. For you.
<</actor>>
<<if $flags.noticedSmell>>
<<actor-thought you>>
Ate it. Didn't clean up. The taste on your tongue last night suddenly has a shape.
<</actor-thought>>
<<elseif $flags.keptQuietSmell>>
<<actor-thought you>>
You didn't ask last night. Now the hallway is asking for you.
<</actor-thought>>
<<else>>
<<actor-thought you>>
An excuse. Your stomach drops without knowing why yet.
<</actor-thought>>
<</if>>
<div id='options'>
[[An excuse? |Ask about excuse]]
[[Ah, don't worry. You didn't do it on purpose.|School][$girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1)]]
<<you-choice "What were you two talking about?">>
<<if $flags.noticedSmell>>
<<actor girlfriend>>Oh... my dog. $bullyName was surprised he didn't notice the new food. Funny how noses work.<</actor>>
<<actor-thought you>>
Dog food. Right. Your jaw hurts from not saying it.
<</actor-thought>>
<<else>>
<<actor girlfriend>>Oh... my dog. $bullyName was surprised he didn't smell the difference in the new food.<</actor>>
<</if>>
[[School |School]]
<</you-choice>>
</div>
<</nobr>><<nobr>>
/* Morning stamp: she is his. Not yours. No dump. ANWO steals the rewrite later. */
<<set $flags.day1ExKissSeen = true>>
<div class="scene-panel">
<img class="hero-img" @src="setup.ImagePath+'story/act1/day1-jenny-ex-kiss.jpg'" alt="Jenny kissing her boyfriend in the school hallway">
<p class="scene-lead">You turn into the main hall and stop in the middle of the morning traffic.</p>
<p class="delayed">
$girlfriendName is kissing $exfriendName by the lockers. His hand rests on her waist, familiar and easy, while students squeeze past them on both sides.
</p>
<<actor-thought you>>
You knew they were together. Seeing it this close is different.
Someone clips your backpack and mutters at you to move.
<</actor-thought>>
<<actor bestfriend>>
God, get a room.
Or at least stop giving strays a free show.
<</actor>>
<<actor bully>>
Damn, save some for after school.
<</actor>>
<<actor-thought you>>
$bullyName gets a laugh from the people around him. $bestfriendName catches you staring and raises an eyebrow.
$girlfriendName does not notice you before the bell rings.
<</actor-thought>>
<div class="continue-links">
[[Pretend you were walking somewhere|School 1 Day - class]]
</div>
</div>
<</nobr>><<nobr>>
<div id="conv">
<<actor teacher>>
Before we start, write down the last promise somebody made to you. Nothing private. I only want to know whether they kept it.
<</actor>>
<<actor teacher>>
Trust is usually built through small things: showing up, telling the truth, and doing what you said you would do.
<</actor>>
<<actor teacher>>
Keep that example. We will come back to it tomorrow.
<</actor>>
<<actor-thought you>>
You write down, "I'll see you at the game."
It is not a promise anyone made to you, but $girlfriendName said it to $exfriendName in the hall.
<</actor-thought>>
<p class="delayed">After the lesson...</p>
<<actor exfriend>>
Hey, $girlfriendName, ready to head out?
<</actor>>
<<actor girlfriend>>
Yeah. One sec.
$exfriendName, wait up.
<</actor>>
<<actor bully>>
You two coming to the game tonight?
<</actor>>
<<actor exfriend>>
Yeah, we'll be there. Right, $girlfriendName?
<</actor>>
<<actor girlfriend>>
Yeah, we'll be there.
<</actor>>
<<actor-thought you>>
There is the promise from your notebook, made and confirmed while you sit close enough to hear it.
<</actor-thought>>
</div>
<div class="delayed">
[[Go to the game|School 1 Day - game]]
</div>
<</nobr>><<nobr>>
You go to the football game that evening and find a seat a few rows behind $girlfriendName and her friends.
<img class="centered delayed" @src="setup.ImagePath+'lectures/1/touchdown.png'">
The crowd jumps at the touchdown. $girlfriendName throws both hands up, and the plastic cup in one of them slips free.
<img class="centered delayed" @src="setup.ImagePath+'lectures/1/cup.png'">
<<actor you>>
Ow. Hey!
<</actor>>
<<actor girlfriend>>
Oh my god, sorry. I lost the cup. Did it hit you?
<</actor>>
<<actor you>>
Only a little. I'm fine.
<</actor>>
<<actor girlfriend>>
Good. I was about to feel terrible for wasting a drink.
<</actor>>
<<actor you>>
Glad your priorities are straight.
<</actor>>
<<actor girlfriend>>
You lived. See you at school.
<</actor>>
<div class="delayed">
$girlfriendName goes back to $exfriendName and $bestfriendName. His arm settles around her waist.
</div>
<<actor bestfriend>>
Nice throw. He got a whole conversation out of it. Best night of his life.
<</actor>>
<<actor girlfriend>>
Shut up. I didn't aim at him.
<</actor>>
<<actor exfriend>>
Babe, sit down. You're blocking the game.
<</actor>>
<<actor girlfriend>>
I'm sitting. Relax.
<</actor>>
<<actor-thought you>>
For a minute she spoke to you like the two of you shared a joke. Then $exfriendName put his arm around her, and the moment ended.
They leave together after the final whistle.
<</actor-thought>>
<<set $relationshipState = 'known'>>
<div class="delayed">
[[Leave school|After school]]
</div>
<</nobr>><<nobr>>
/* Still his girlfriend. No breakup until ANWO rewrite. */
<p class="delayed">
The morning hallway is crowded. $girlfriendName stands by the stairs with $bestfriendName, laughing at something on a phone.
$exfriendName reaches over to take her backpack when she starts fixing her hair. She hands it to him without interrupting her conversation.
</p>
<<actor-thought you>>
Yesterday she kissed him in front of everyone. Today he carries her bag.
You keep walking before $bestfriendName catches you looking again.
<</actor-thought>>
<img class="hero-img centered delayed" @src="setup.ImagePath+'school/mc-bored-class.jpg'" alt="MC sitting bored in class">
<<actor teacher>>
Take out yesterday's promise. Under it, write what happens when one person wants more from a relationship than the other.
<</actor>>
<<actor-thought you>>
You leave the page blank until $teacherName starts walking between the desks. Then you write, "They get hurt," and close the notebook.
<</actor-thought>>
<<actor teacher>>
That answer is not always dramatic. Sometimes the other person never knows there was a problem.
<</actor>>
<p class="delayed">After the bell, $girlfriendName waits near the door while $exfriendName finishes packing. You have enough time to say something before they leave.</p>
<span id="conv"></span>
<div id="options">
<<you-choice "Wave at $girlfriendName from a safe distance.">>
<<actor girlfriend>>...Hey.<</actor>>
<<actor bestfriend>>Careful. He'll think that means something.<</actor>>
<<actor exfriend>>
You know him?
<</actor>>
<<actor girlfriend>>
He sits behind us. Come on, we're late.
<</actor>>
<<actor-thought you>>
She remembered enough to wave. You will replay those two seconds all evening, even though her boyfriend was standing beside her.
<</actor-thought>>
<<set $aroused = $aroused gte 90 ? $aroused : $aroused + 10>>
<div class="delayed">[[Leave school|After school]]</div>
<</you-choice>>
<<you-choice "I'm going straight home. No self-inflicted damage.">>
<<actor-thought you>>
You leave before wanting her turns into another public embarrassment.
<</actor-thought>>
<div class="delayed">[[Leave school|After school]]</div>
<</you-choice>>
<<you-choice "I'll take the long way home and clear my head.">>
<<actor-thought you>>You circle two extra blocks before the hallways stop replaying. It does not fix anything, but you reach home breathing normally again.<</actor-thought>>
<div class="delayed">[[Leave school|After school][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</you-choice>>
</div>
<</nobr>><<nobr>>
<img class="hero-img centered" @src="setup.ImagePath+'story/act1/day1-anwo-lecture.jpg'" alt="ANWO lecture">
<<actor teacher>>
The district has approved a new social studies unit. It is called ANWO, short for Alpha New World Order.
<</actor>>
<<actor teacher>>
Its supporters believe status should decide who leads, who receives authority, and how much influence a person has over others.
<</actor>>
<<actor teacher>>
You are not being asked to support it. Your job is to study what those rules would do to ordinary relationships at school, at work, and at home.
<</actor>>
<<actor teacher>>
You will work in groups of five. By next month, each group will submit survey data and present its conclusions to the class.
<</actor>>
<<actor-thought you>>
Nobody reacts to the name. You heard it for the first time on the email that changed your life, but everyone else writes it down without looking worried.
<</actor-thought>>
<<actor exfriend>>
$girlfriendName, want to use the same group as last term? I can organize the data.
<</actor>>
<<actor girlfriend>>
Yeah, you're good at that. We should get $bullyName for interviews too.
<</actor>>
<<actor exfriend>>
If he actually does the work.
<</actor>>
<<actor bully>>
I heard that. Put my name down.
<</actor>>
<<actor girlfriend>>
Only if you answer the group chat this time.
<</actor>>
<<actor bully>>
No promises, but I'll make people talk.
<</actor>>
<img class="hero-img centered delayed" @src="setup.ImagePath+'story/act1/day1-group-form.jpg'" alt="project group forming">
<<actor bestfriend>>
I'm joining before this turns into two guys arguing over a spreadsheet.
<</actor>>
<<actor girlfriend>>
Good. That's four.
<</actor>>
<<actor-thought you>>
You wait for her to look at you. She checks the room first, counting who is still available.
<</actor-thought>>
<<actor girlfriend>>
$youName, you're with us. You can keep the interview notes and help me present.
<</actor>>
<<actor you>>
Yeah. Of course.
<</actor>>
<<actor bestfriend>>
He answered before you finished the sentence. At least enthusiasm won't be the problem.
<</actor>>
<<actor girlfriend>>
Be nice. He's my boyfriend.
Baby, send me your number after class. I'll make the chat.
<</actor>>
<<actor bully>>
Boyfriend got the last chair. Don't make her regret saving it for you.
<</actor>>
<<actor-thought you>>
$girlfriendName calls you her boyfriend in front of everyone, and nobody questions it.
She also chose every other member before you. The pleasure and the embarrassment arrive together.
<</actor-thought>>
<<run setup.nudgeArousal(8)>>
<<set $flags.phoneUnlocked = true>>
<<set $flags.anwoGroupFormed = true>>
<<set $storyAct = 1>>
<<set $flags.questHint = "Open Phone and read the project group chat.">>
<div class="delayed">
[[Leave school|After school]]
</div>
<</nobr>><<nobr>>
/* --- Social --- */
<<if !$flags.resultsLiveSeen>>
<<set $flags.resultsLiveSeen = true>>
<p class="delayed">
You never opened the results message. $teacherName's delighted expression tells you the PDF has already left the group, which makes your stomach tighten.
</p>
<<else>>
<p class="delayed">
The chat was right. $teacherName looks delighted, which makes your stomach tighten.
</p>
<</if>>
<img class="centered delayed" @src="setup.ImagePath+'teacher/sitting-smiling.jpeg'">
<<actor teacher>>
Hello, class. Wonderful projects this cycle. One was so impressive I need those students to stay.
<</actor>>
<<actor teacher>>
$girlfriendName, $bullyName, $exfriendName, $bestfriendName, and $youName, remain after the bell.
<</actor>>
/* --- Class / aftermath --- */
<p class="delayed">After class, the door shuts. $teacherName praises the group, then explains how far she has already sent the results.</p>
<<actor teacher>>
Your work was exceptional. I published the results and informed the student council. They were especially interested in how much support your respondents showed for ranking as a discipline tool.
<</actor>>
<<actor teacher>>
This project may influence policy beyond the classroom.
<</actor>>
<<if $flags.day8SpokeUp>>
<<actor-thought you>>
You tried to flag the bias. Nobody put it in the PDF. Now the PDF is policy.
<</actor-thought>>
<</if>>
<<actor you>>
I need to tell you something about this study...
<</actor>>
<<actor you>>
These results aren't that impressive. The survey led people there because of how the questions were written.
<</actor>>
<<actor teacher>>
That is a serious accusation, $youName. Are you saying the group submitted results you knew were misleading?
<</actor>>
<<actor bestfriend>>
$youName, what have you DONE?
I told you he was a liability.
<</actor>>
<<actor bully>>
Did you cheat?
<</actor>>
<<actor you>>
All of you knew! I told you!
<</actor>>
<<actor bestfriend>>
Girl. He is so loud when he panics. This is embarrassing for *you*, $girlfriendName.
<</actor>>
<p class="delayed">They deny it with the smooth practice of people who already chose the grade.</p>
<<actor exfriend>>
We didn't know anything. You were in charge of the survey.
<</actor>>
<<actor-thought you>>
He ran the online flood. You did park and $sisterName. Now he's rewriting the spreadsheet with your name on the blame.
<</actor-thought>>
<p class="delayed">$girlfriendName's mouth opens a half inch, then closes again. She looks at the desk instead of at you.</p>
/* --- Private pressure --- */
<<actor teacher>>
$youName, I will remember this. For now, you will cooperate while I determine how much damage your claim has caused.
<</actor>>
<<actor teacher>>
The council may proceed regardless. Do not interrupt me with another accusation unless you are prepared to document it properly.
<</actor>>
<<set $flags.day10Confessed = true>>
<<set $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1)>>
<div class="delayed">
[[Leave school|After school]]
</div>
<</nobr>><<nobr>>
/* --- Social --- */
<p class="delayed">
The hallway buzz is wrong, too excited, too mean. Someone already printed a mock "alpha list" on a phone wallpaper.
</p>
<<actor bully>>
Heard student council wants to "try something new." Bet I make the cut.
<</actor>>
<<actor exfriend>>
If it's based on our project, we all made the cut. That's the point.
<</actor>>
<<actor-thought you>>
"We" is doing a lot of work in that sentence.
<</actor-thought>>
/* --- Class --- */
<img class="centered delayed" @src="setup.ImagePath+'teacher/standing-mean.jpeg'">
<<actor teacher>>
Hello, students. Exciting news.
<</actor>>
<<actor teacher>>
Thanks to the excellent results from the study led by $youName's group, the student council proposes we implement ANWO principles in this class.
<</actor>>
<<actor teacher>>
In practice, we will maintain public provisional alpha and beta lists and update them after each test.
Alphas will receive first choice of partners for drills. Betas will answer first when I call on them.
Your conduct toward higher-ranked students will affect your standing.
Physical confidence and presence will count alongside academic performance.
<</actor>>
<<actor teacher>>
Upcoming sessions will assess performance, presence, and instinct. Some of you will lead, while others will practice following instructions.
<</actor>>
<<actor-thought you>>
Oh no.
<</actor-thought>>
<p class="delayed">$exfriendName's knuckles go white around his pen. He must be racing through the same tally he just read aloud.</p>
<<actor bestfriend>>
This is going to be so messy.
Especially for $youName. I kind of can't look away.
<</actor>>
<<actor teacher>>
Messy is how culture changes. Bring courage. Leave excuses at the door.
<</actor>>
/* --- Private --- */
<p class="delayed">Bell. Bodies pour out. $girlfriendName catches your sleeve before you hit the stairs.</p>
<<actor girlfriend>>
Hey, take a breath. It's still just a class structure... for now.
<</actor>>
<span id="conv"></span>
<div id="options">
<<you-choice "This is because of our survey. Because of me.">>
<<actor girlfriend>>Because of all of us. Don't martyr yourself in the hallway.<</actor>>
<div class="delayed">[[Continue|School 12 Day anwo private][$flags.day12BlameSelf = true]]</div>
<</you-choice>>
<<you-choice "What if they put me in beta?">>
<<actor girlfriend>>Then you handle it. Or I help you handle it. Quietly.<</actor>>
<div class="delayed">[[Continue|School 12 Day anwo private][$flags.day12FearBeta = true]]</div>
<</you-choice>>
<<you-choice "Reach for her hand.">>
<<actor girlfriend>>Please, not here. People are already watching how everyone reacts.<</actor>>
<<actor-thought you>>
She doesn't pull away immediately. She delays. Then she slips free... and that delay is worse than a no.
<</actor-thought>>
<div class="delayed">[[Continue|School 12 Day anwo private][$flags.day12ReachedHand = true]]</div>
<</you-choice>>
</div>
<</nobr>><<nobr>>
<<if !$flags.classListLive>><<set $flags.publicRankUnread = true>><</if>>
<<set $flags.classListLive = true>>
<<if $flags.day12ReachedHand>>
<<actor girlfriend>>
Later, when no one is watching. I still like you, but I don't want the hallway turning us into a show.
<</actor>>
<p class="delayed">After a beat, she hooks two fingers in yours behind the stair rail... hidden, brief, electric, then lets go.</p>
<<run setup.changeFavor(1)>>
<<elseif $flags.day12FearBeta>>
<<actor girlfriend>>
If they call you beta, don't argue in front of them. Argue with me at home. Public fights make you look smaller.
<</actor>>
<<if ($alphaBeta || 0) gte 3>>
<<actor girlfriend>>
And honestly? You already flinch like you're waiting for the label. Fix that face.
<</actor>>
<</if>>
<<else>>
<<actor girlfriend>>
Stop eating yourself alive. We ride this. Together, as long as you don't light yourself on fire for points you can't win.
<</actor>>
<</if>>
<<actor girlfriend>>
Between us? If this place starts handing out labels, do not argue about us in public.
Talk to me privately, and listen when I tell you to stop.
<</actor>>
<<actor-thought you>>
Keys. Control. Her perfume cuts through the fear, and something hotter under it.
<</actor-thought>>
<<run setup.nudgeArousal(8)>>
<<set $flags.classListLive = true>>
<<set $flags.questHint = "Phone: open Ranks, the provisional Alpha/Beta list is live.">>
<div class="continue-links">
[[Leave school|After school]]
</div>
<</nobr>><<nobr>>
<<actor teacher>>
Hello, students. Today will be your first test.
<</actor>>
<<actor teacher>>
Remember that alpha standing is competitive. Your performance will be compared with everyone else's.
<</actor>>
<<actor teacher>>
The first test is on your mathematics skills. $bullyName, what is 5 x 8?
<</actor>>
<<actor bully>>
40!
<</actor>>
<<actor teacher>>
Correct. $exfriendName, what is 15 x 15?
<</actor>>
<<actor exfriend>>
225
<</actor>>
<p class="delayed">$teacherName pauses just long enough to choose her target, then calls your name. There is nothing random about it.</p>
<<actor teacher>>
Correct. Now, $youName, give me every solution to the equation x squared equals 144.
<</actor>>
<span id="conv"></span>
<div id="options">
<<you-choice "12 and -12.">>
<<set $flags.day13CompleteAnswer = true>>
<<run setup.applyRecognition("act1-day13-complete")>>
<<actor teacher>>Correct. Both values produce 144 when squared. Keep that focus for the next assessment.<</actor>>
<<include "School 13 Day anwo after answer">>
<</you-choice>>
<<you-choice "12... and negative...">>
<<set $flags.day13CompleteAnswer = false>>
<<run setup.applyRecognition("act1-day13-incomplete")>>
<img class="centered delayed" @src="setup.ImagePath+'lectures/13/laugh.jpeg'" alt="students reacting to the incomplete answer">
<<actor teacher>>
You trailed off before you finished. They are 12 and -12. Next time, commit to the whole answer instead of waiting for permission to be right.
That kind of hesitation will lower your provisional standing.
<</actor>>
<<actor-thought you>>She was always going to take the second answer from me.<</actor-thought>>
<<include "School 13 Day anwo after answer">>
<</you-choice>>
</div>
<</nobr>><<nobr>>
<<actor teacher>>
Our next assessment concerns sexual fantasies. The council considers reproductive confidence part of alpha behavior.
<</actor>>
<<actor teacher>>
$youName, please stay after class for a moment.
<</actor>>
<div class="delayed">
After class...
</div>
<img class="centered delayed" @src="setup.ImagePath+'teacher/sitting-mean.jpeg'">
<<actor teacher>>
<<if $flags.day13CompleteAnswer>>Your mathematics answer was correct. The fantasy assessment is separate, and confidence there counts just as much.<<else>>$youName, today wasn't your best day. I suggest you prepare for the sexual fantasies test.<</if>>
<</actor>>
<<actor teacher>>
Prepare by reviewing the qualities the council associates with alpha behavior. Avoid anything they classify as "sissy" behavior.
<</actor>>
<<actor-thought you>>
<<if setup.isResistant()>>She still expects me to research the label. Fine. I want to know exactly what they are testing.<<else>>What does "sissy" even mean?<</if>>
<</actor-thought>>
<<actor you>>
Yes, thank you, $teacherName. I'll make sure to prepare thoroughly!
<</actor>>
<<actor-thought you>>
I need to look that up right away.
<</actor-thought>>
<<set $flags.sissyHintGiven = true>>
<<set $flags.questHint = "Phone: Google what a sissy is, then talk to the group chat and finish the quiz.">>
<div class="continue-links">
[[Leave school|After school]]
</div>
<</nobr>><<nobr>>
<<if !$flags.sissyTestDone && !$flags.sissyTestDeclined>>
<<set $flags.questHint = "Phone: Google sissy, open the group chat, then choose whether to take the quiz.">>
<<actor-thought you>>
I should google sissy and talk about it with my friends first. Then I need to decide what to do with $bestfriendName's quiz.
<</actor-thought>>
<div class="continue-links">
[[Go home and use Phone|Home][$schoolDay = 15; $gameDate = setup.changeDate($gameDate, 'hours', 2)]]
</div>
<<else>>
<<set $flags.questHint = "">>
<<actor-thought you>>
<<if $flags.sissyTestDone>>I did the reading. I took the quiz. I should be ready this time.<<else>>I read the definition and stopped. That should be enough preparation.<</if>>
<</actor-thought>>
<img class="centered delayed" @src="setup.ImagePath+'teacher/sitting-thinking.jpeg'">
<<actor teacher>>
Good morning. I hope you prepared for today's assessment.
<</actor>>
<<actor teacher>>
Please place your phones in the basket at the front. I will hand out the assessment once everyone is seated.
<</actor>>
<<actor teacher>>
You have two hours to write an essay describing your ideal sexual experience.
<</actor>>
<p class="delayed">
Everyone puts a phone in the basket at the front.
</p>
<img class="centered delayed" @src="setup.ImagePath+'lectures/15/smartphone-basket.jpg'">
<p class="delayed">
The class begins writing. Once every head is down, $teacherName carries the basket into the hall.
</p>
<div class="delayed">
[[Finish essay | School 15 Day anwo finish essay]]
</div>
<</if>>
<</nobr>><<nobr>>
<p class="letter-head">My sex life</p>
<p class="letter">...
$girlfriendName pulls me into bed and tells me she has been waiting all day. I kiss her, spread her legs, and slide inside her while she says my name.
I hold her hips and fuck her harder when she asks. She wraps her legs around me and keeps me close, looking at me the entire time.
We come together. Afterward, she lies against my chest and tells me I am the only man she wants.
...
</p>
<<actor-thought you>>
It sounds confident enough to pass. At least, you hope it does.
<</actor-thought>>
[[Teacher comes back | School 15 Day anwo teacher comes back]]
<</nobr>><<nobr>>
<<actor teacher>>
Thank you. I will read the essays before the next ranking update.
<</actor>>
<<actor teacher>>
However, the essays were only part of the assessment. I also reviewed the recent search history on each phone.
<</actor>>
<<actor teacher>>
Search history often reveals interests that students leave out of a formal essay.
<</actor>>
<<actor teacher>>
$exfriendName, your recent searches include: "$girlfriendName naked," "deepfake girlfriend," "lesbian porn."
<</actor>>
<<actor-thought you>>
This guy is still obsessed with my girlfriend. What a loser.
<</actor-thought>>
<<actor teacher>>
You pass this assessment.
<</actor>>
<<actor you>>
What? Why?
<</actor>>
<<actor teacher>>
Just because he doesn't have $girlfriendName doesn't automatically make him a beta. He's clearly still fixated on her and interested in women.
<</actor>>
<<actor teacher>>
$bullyName, your searches were: "3-some," "Is 10 inches small?"
<</actor>>
<<actor teacher>>
That is also a pass. The insecurity is unnecessary, but the search still reflects the confidence profile we are measuring.
<</actor>>
<<actor bully>>
Yeah!
<</actor>>
<<set _quizRoute = $flags.sissyTestDone && !$flags.sissyTestDeclined ? "quiz" : (!$flags.sissyTestDone && $flags.sissyTestDeclined ? "declined" : "unknown")>>
<<if _quizRoute eq "quiz">>
<<actor teacher>>
Lastly, $youName, you searched for: "What is a sissy?" and "12 sissy types."
<</actor>>
<<actor teacher>>
One definition might have been reasonable preparation. Reading through twelve types shows sustained interest in the subject. You did not pass this assessment.
<</actor>>
<<actor you>>
But you told me to educate myself about sissies?!
<</actor>>
<<actor teacher>>
I told you to avoid the behavior. I did not instruct you to research it, and your decision is part of what I assessed.
<</actor>>
<<actor-thought you>>
It feels like a trap. She never said where preparation ended and interest began.
<</actor-thought>>
<<elseif _quizRoute eq "declined">>
<<actor teacher>>
Lastly, $youName, your recent search was: "What is a sissy?"
<</actor>>
<<actor teacher>>
One definition was reasonable preparation. You stopped there instead of turning it into sustained interest. You pass this assessment.
<</actor>>
<<actor-thought you>>
For once, stopping when something felt wrong actually helped.
<</actor-thought>>
<<else>>
<<actor teacher>>
Lastly, $youName, your assessment record is incomplete. I cannot assign the quiz result until the conflicting entry is corrected.
<</actor>>
<<actor-thought you>>
At least she cannot turn a choice you never made into a result you earned.
<</actor-thought>>
<</if>>
<p class="delayed">In the aisle, $girlfriendName's mouth is a thin line... not quite a smile, not quite pity.</p>
<<actor girlfriend>>
<<if _quizRoute eq "quiz">>So browser history decides our rank now. We'll talk later, somewhere private.<<elseif _quizRoute eq "declined">>So refusing $bestfriendName's quiz actually helped. Don't look so surprised.<<else>>That record is a mess. We are not pretending you chose either result.<</if>>
<</actor>>
<<if ($alphaBeta || 0) gte 3>>
<p class="delayed">$girlfriendName watches you pack up, eyes half closed, like she already knows which corner you'll back yourself into next.</p>
<</if>>
<<if $aroused lt 90>><<run setup.nudgeArousal(8)>><</if>>
<<if _quizRoute eq "quiz">><<run setup.applyRecognition("act1-day15-trap")>><<elseif _quizRoute eq "declined">><<run setup.applyRecognition("act1-day15-decline")>><</if>>
<<set $flags.day15Passed = true>>
<<set $flags.questHint = "">>
<div class="continue-links">
[[Leave school|After school]]
</div>
<</nobr>><<nobr>>
<<set _tookQuiz = !!$flags.sissyTestDone>>
<<set _declinedQuiz = !!$flags.sissyTestDeclined>>
/* --- Social --- */
<<if _tookQuiz>>
<p class="delayed">
Yesterday's "test" is already hallway currency. Someone whispers "sissy types" and laughs when you pass.
</p>
<<actor bully>>
Rough day, man. Twelve types? You really did the extra reading.
<</actor>>
<<actor exfriend>>
Leave him. $teacherName set a trap. Half the class would have googled it.
<</actor>>
<<actor bestfriend>>
Would *we*, though?
Some people just scream "Google sissy at 2 a.m." Not naming names. Oh wait, $youName.
<</actor>>
<<elseif _declinedQuiz>>
<p class="delayed">Yesterday's phone check is already hallway currency. Someone repeats the one search you made, but the joke loses force when another student points out that you passed.</p>
<<actor bully>>
You stopped after one definition? Smartest thing you did all week, man.
<</actor>>
<<actor exfriend>>
He passed. Drop it. The quiz was the trap, and he did not take it.
<</actor>>
<<actor bestfriend>>
He still typed "What is a sissy?" into Google. I am allowed one joke, loser.
<</actor>>
<<else>>
<p class="delayed">Yesterday's phone check has become hallway gossip, but nobody agrees on what your result meant.</p>
<<actor exfriend>>The assessment record is what matters. Wait for $teacherName.<</actor>>
<</if>>
/* --- Class --- */
<img class="hero-img centered delayed" @src="setup.ImagePath+'story/act1/day16-teacher-debrief.jpg'" alt="The teacher reviewing the class after the test">
<<actor teacher>>
<<if _tookQuiz>>Good morning. Some of you learned that curiosity is not the same as alpha instinct.<<elseif _declinedQuiz>>Good morning. Yesterday's assessment distinguished curiosity from restraint.<<else>>Good morning. We will clarify yesterday's assessment before updating the ranks.<</if>>
<</actor>>
<<actor teacher>>
Today we will review your essays and update the provisional ranks. Your standing can still rise or fall based on your conduct.
<</actor>>
<<actor teacher>>
<<if _tookQuiz>>$youName, look at me. Embarrassment only matters if you learn from it. Hiding will not improve your rank.<<elseif _declinedQuiz>>$youName, look at me. You stopped after the definition and passed. Do not confuse hallway laughter with an official result.<<else>>$youName, look at me. Your recorded conduct, not hallway gossip, determines the assessment.<</if>>
<</actor>>
<<actor-thought you>>
<<if _tookQuiz>>She smiles when she says your name. The room hears it.<<elseif _declinedQuiz>>The room hears her say that you passed. $bestfriendName still looks amused, but the official result belongs to you.<<else>>The room quiets when she separates the record from the rumor.<</if>>
<</actor-thought>>
/* --- Private --- */
<p class="delayed">After class, $girlfriendName finds you by the corridor water fountain, smaller audience than the park. Still not private.</p>
<<actor girlfriend>>
<<if _tookQuiz>>Hey. Ignore $bullyName. He's high on winning a phone check.<<elseif _declinedQuiz>>Hey. You passed. Let them get bored with the one search they have.<<else>>Hey. Ignore the hallway version until we know what the record says.<</if>>
<</actor>>
<<actor girlfriend>>
<<if _tookQuiz>>But you did walk straight into that search because she hinted at it. Next time, ask me before you hand her something she can use against you.<<elseif _declinedQuiz>>You read the definition, saw $bestfriendName's quiz, and said no. That was the right call. Remember that before you let her rewrite it as a failure.<<else>>Next time, tell me what happened before the group chat turns it into a story.<</if>>
<</actor>>
<span id="conv"></span>
<div id="options">
<<identity-choice resistance "They don't get to rewrite what happened.">>
<<actor girlfriend>><<if _declinedQuiz>>Good. Keep that sentence when they try again. You stopped, you passed, and the joke does not change either fact.<<else>>I know. That's why it was mean. You trusted the hint and she used it against you.<</if>><</actor>>
<div class="delayed">[[Continue|School 16 Day anwo end][_ab = setup.applyIdentity("act1-day16-defend"); _public = setup.applyRecognition("act1-day16-defend")]]</div>
<</identity-choice>>
<<you-choice "What did you think of my result?">>
<<if $girlfriendTrustLevel gt 5>>
<<actor girlfriend>><<if _declinedQuiz>>You made the right decision without waiting for me to rescue you. I noticed.<<else>>I hate the attention around the label. I don't hate you. Walk with me anyway.<</if>><</actor>>
<div class="delayed">[[Continue|School 16 Day anwo end][$girlfriendTrustLevel = setup.changeFavor(1)]]</div>
<<else>>
<<actor girlfriend>><<if _declinedQuiz>>It was the correct call. Do not fish for praise in the hallway.<<else>>Don't make me answer that in public. Just... keep your head down a week.<</if>><</actor>>
<div class="delayed">[[Continue|School 16 Day anwo end]]</div>
<</if>>
<</you-choice>>
<<you-choice "Laugh it off before they can.">>
<<actor girlfriend>><<if _declinedQuiz>>You do not need to help them, but at least that version is true.<<else>>Don't gift them the joke. Let them work for it.<</if>><</actor>>
<<actor-thought you>>
<<if _declinedQuiz>>You laugh because the official result is already settled. They only have the search box now.<<else>>Laughing hurts less than defending yourself, so you let the joke belong to them.<</if>>
<</actor-thought>>
<div class="delayed">[[Continue|School 16 Day anwo end][_public = setup.applyRecognition("act1-day16-embrace-joke")]]</div>
<</you-choice>>
</div>
<</nobr>><<nobr>>
<<set _tookQuiz = !!$flags.sissyTestDone>>
<<set _declinedQuiz = !!$flags.sissyTestDeclined>>
<<actor girlfriend>>
<<if _tookQuiz>>Text me later. And maybe stay off "educational" searches for a bit.<<elseif _declinedQuiz>>Text me later. You passed, and I want you to remember why before $bestfriendName starts again.<<else>>Text me later when the hallway gets bored.<</if>>
<</actor>>
<<actor girlfriend>>
Also, if anyone in that group chat gets meaner, tell me first. I can be protective or possessive. Same lipstick either way.
<</actor>>
<<actor bully>>
<<if _tookQuiz>>(From down the hall) Yo, soft-search! Don't cry into your browser history tonight!<<elseif _declinedQuiz>>(From down the hall) Yo, definition boy! One search and one pass. Try not to overachieve tonight!<<else>>(From down the hall) Yo, phone-check! Hallway review is not over yet!<</if>>
<</actor>>
<<set _youRank = setup.getPlayerClassRank()>>
<p class="delayed">A provisional list hangs on the board by the door, its marker still wet. It shows the same data as Phone → Ranks.</p>
<<actor-thought you>>
<<if _youRank>>Your name is #<<= _youRank.rank>>, marked <<print _youRank.band>>. Someone has already taken a photo.<<else>>The board is still refreshing. Someone already has a phone pointed at it.<</if>>
<</actor-thought>>
<<if _youRank and _youRank.isAlpha>>
<<actor bestfriend>><<if _tookQuiz>>Search-history boy landed in the Alpha half and still gave us that browser tab.<<elseif _declinedQuiz>>He passed the phone check and landed in the Alpha half. Annoying, but the one search is still funny.<<else>>The hallway rumor landed in the Alpha half.<</if>>
Check your phone if you want the full ranking.<</actor>>
<<else>>
<<actor bestfriend>><<if _tookQuiz>>Aww, look, they ranked the search-history boy.<<elseif _declinedQuiz>>You passed the phone check and still landed down here. That part is not my fault.<<else>>They ranked you before the hallway settled on a version.<</if>>
Don't trip on the way out, Beta.
Check your phone if you want the full ranking.<</actor>>
<</if>>
<<actor girlfriend>>
Ignore the board. For now.
Or stare at it with everyone else. Phone Ranks is the same list.
Walk.
<</actor>>
<<actor-thought you>>
The ranking system has become a list on glass and whispers in the hall. Her hand hovers near your back, close enough to guide you without quite touching.
<</actor-thought>>
<<run setup.nudgeArousal(8)>>
<div class="continue-links">
<<if setup.classRankingHasUpdate()>>
[[Look at the ranking board|Class board]]
<</if>>
[[Leave school|After school]]
</div>
<</nobr>><<nobr>>
<div id="conv">
<<actor teacher>>
Good morning. Before we begin, I need to explain a change to these classes.
<</actor>>
<<actor teacher>>
The council has approved "physical confidence" as a ranking factor. Your standing will now reflect presence and size as well as academic performance.
The council also believes that lower-ranked students are not showing enough respect to those above them.
<</actor>>
<<actor teacher>>
Today I will demonstrate why size influences that part of the ranking. Please pay attention to the comparison.
<</actor>>
<img class="centered delayed" @src="setup.ImagePath+'lectures/1/white-black-cock.jpeg'">
<img class="centered delayed" @src="setup.ImagePath+'lectures/1/alpha-beta-cock.jpeg'">
<img class="centered delayed" @src="setup.ImagePath+'lectures/1/white-black-cock2.jpeg'">
<<actor teacher>>
These images illustrate the physical differences included in the council's scoring criteria. Smaller students receive fewer points in this category.
<</actor>>
<<actor teacher>>
Many women are taught to say that size does not matter, but their reactions often suggest otherwise.
<</actor>>
<<actor girlfriend>>
Stop that. I don't believe your nonsense.
<</actor>>
<<actor teacher>>
You do not believe the material, so we will test it. $youName and $bullyName, please come to the front of the room.
I prefer willing participants, but a refusal will be recorded as beta hesitation.
<</actor>>
</div>
<div id="options">
<<you-choice "I will prove you wrong!">>
<<set $flags.day20Exposed = true>>
<<run setup.applyRecognition("act1-day20-expose")>>
<<actor bully>>
Sure, I'm in.
<</actor>>
<p class="delayed">You step beside $bullyName and unzip before you can lose your nerve. He strips too. With both of you exposed, the difference is obvious, and the room notices before $teacherName says a word.</p>
<img class="centered delayed" @src="setup.ImagePath+'lectures/1/show-off.png'">
<<include "First time alpha cock see">>
<</you-choice>>
<<you-choice "This is insane. I'm not doing that.">>
<<set $flags.day20Exposed = false>>
<<run setup.applyRecognition("act1-day20-refuse")>>
<<actor teacher>>
Your refusal is noted. Stand at the front anyway. You may remain dressed while $bullyName demonstrates physical confidence.
<</actor>>
<<actor bully>>
Relax. I'll do the heavy lifting. Literally.
<</actor>>
<<actor bestfriend>>
He said no and still walks up. Classic.
<</actor>>
<p class="delayed">You keep your jeans closed. $bullyName does not. $teacherName positions you beside him and lets your refusal become the comparison instead.</p>
<img class="centered delayed" @src="setup.ImagePath+'lectures/1/show-off.png'">
<<include "First time alpha cock see">>
<</you-choice>>
</div>
<</nobr>><<nobr>>
<<actor girlfriend>>
...
<</actor>>
<p class="delayed">$girlfriendName's eyes drop to $bullyName despite herself, then snap back to his face. Her expression changes before she can hide it.</p>
<<actor girlfriend>>
Okay, he is... I mean, it is objectively impressive. I'm not going to pretend I didn't see it.
<</actor>>
<<actor bestfriend>>
$girlfriendName's face rn is sending me. She's doing the thing where she tries not to look and looks twice.
<</actor>>
<<actor girlfriend>>
Shut up, $bestfriendName.
<</actor>>
<<actor-thought you>>
Your mind stalls when you see her expression. For half a second, she forgets that you are in the room.
You recognize that look from bed, but you have never been the one to draw it out of her.
<</actor-thought>>
<<actor you>>
Okay... can I sit down now?
<</actor>>
<<actor bully>>
Relax, man. It's just genetics. Don't make it weird.
<</actor>>
<<actor bestfriend>>
He said "just genetics" like he didn't just end someone's relationship in front of thirty people.
<</actor>>
<<actor teacher>>
<<if $flags.day20Exposed is false>>You have seen physical confidence and hesitation side by side. The council considers that reaction measurable evidence.<<else>>You have all seen the size comparison. The council considers it measurable evidence, regardless of your personal reaction.<</if>>
For homework, study the physical distinctions between alpha and beta classifications. The board will be updated to reflect today's demonstration.
<</actor>>
<<run setup.nudgeArousal(12)>>
<<set $flags.anniversaryTonight = true>>
<<set $relationshipState = "reset">>
<p class="delayed">After class, $girlfriendName catches your sleeve in the hallway, away from $bullyName.</p>
<<actor girlfriend>>
Hey. Look at me. Not at the floor.
Tonight is ours. Anniversary. I can't meet after school, $sisterName needs me for something first.
Go home and wait for me. Don't spiral all night before I get there.
<</actor>>
<<actor-thought you>>
Her perfume and the pressure of her hand should calm you, but your head is still full of $bullyName and the laughter from class.
You can hear how hard she is trying to sound normal, which somehow makes the humiliation harder to ignore.
<</actor-thought>>
<<actor you>>
I'll be there. I swear.
<</actor>>
<<actor girlfriend>>
Then be there. Not on the phone, not in a hallway. Home.
<</actor>>
<<set $flags.questHint = "Anniversary night. You are too wound up, Home → Lose control.">>
<<run setup.peakArousal()>>
<div class="continue-links">
[[Go home aching|Home][$gameDate = setup.changeDate($gameDate, 'hours', 4)]]
</div>
<</nobr>><<nobr>>
<div id="conv">
<<actor teacher>>
We have spent several sessions comparing alpha and beta classifications.
<</actor>>
<<actor teacher>>
Today we will discuss chastity as a method of behavior control.
<</actor>>
<img class="centered delayed" @src="setup.ImagePath+'lectures/2/locked-cock.jpg'">
<<actor teacher>>
A chastity device prevents unsupervised stimulation. The council recommends it when a student repeatedly ignores agreed limits.
<</actor>>
<<actor teacher>>
For homework, if you know a smaller student who repeatedly ignores rules, fit him with a chastity device until our next session. Keyholders should record the fit, behavior changes, and requests for release.
<</actor>>
<<actor you>>
You won't lock me up, right, $girlfriendName?
<</actor>>
<<actor girlfriend>>
No. I think it's a little radical.
I mean... as long as you play by the rules, why cage it?
<</actor>>
<<actor bully>>
After the size demo? Radical is just efficient.
<</actor>>
<<actor bestfriend>>
She said "as long as." You heard that part, right? Your face definitely did.
<</actor>>
<<actor-thought you>>
Her smile is soft, but she holds your gaze when she says "rules." You remember the Day 20 board and look away first.
<</actor-thought>>
</div>
<p class="delayed">After the bell, she walks with you as far as the stairs, close enough that $bullyName can see, quiet enough that he cannot hear.</p>
<img class="hero-img centered delayed" @src="setup.ImagePath+'story/act2/day25-rules-stairs.jpg'" alt="rules warning after class">
<<actor girlfriend>>
That lecture was intense. But she isn't totally wrong about... control.
<</actor>>
<<actor girlfriend>>
I meant what I said. Play by the rules and I don't need a lock.
Hands off yourself. Show up when you say you will. Make me feel chosen, not like a pause between strokes.
<</actor>>
<<actor girlfriend>>
<<if $flags.caughtStroking1>>If you do it again, I'm done having the same argument.<<else>>If you break that rule, I'm not going to argue about it afterward.<</if>> $sisterName already offered me a solution.
<</actor>>
<<if $flags.caughtStroking1>>
<<actor-thought you>>
Anniversary. Her on your bed. Your hand later that same night. She remembers.
<</actor-thought>>
<<else>>
<<actor-thought you>>
She says it like a joke. Your cock still hears a threat.
<</actor-thought>>
<</if>>
<<actor you>>
I can follow rules.
<</actor>>
<<actor girlfriend>>
Good, prove it. Come home later, and don't sneak off because you "need a minute."
<</actor>>
<<run setup.peakArousal()>>
<<set $flags.day25RulesWarning = true>>
<<set $flags.mustResolveCage = true>>
<<set $flags.questHint = "You promised to follow the rule. Home: try to get through the evening.">>
<div class="continue-links">
[[Go home (you are buzzing)|Home][$gameDate = setup.changeDate($gameDate, 'hours', 4)]]
</div>
<</nobr>><<nobr>>
<<if $caged>><<run setup.applyRecognition("owned-day26-locked")>><</if>>
<<if $flags.ultimateHumiliationDone>>
<<actor-thought you>>
Last time you stood in this hallway, $bullyName was in your living room and $girlfriendName was wearing his cologne on her neck.
Today is just Monday. The lock doesn't know what day it is. You do.
<</actor-thought>>
<<elseif $caged>>
<<actor-thought you>>
The lock shifts under your jeans as you cross the same hallway.
You still hear that morning's rules: you clean when she says, begging makes her wait longer, and Fridays belong to whoever she invites.
<</actor-thought>>
<<else>>
<<actor-thought you>>
Something changed. You can feel it in the way $girlfriendName looks at you when she thinks you're not watching.
<</actor-thought>>
<</if>>
<img class="hero-img centered delayed" @src="setup.ImagePath+'places/school.jpg'" alt="school entrance">
<<actor girlfriend>>
Morning. Try not to make that careful walk so obvious.
<</actor>>
<<if $caged>>
<<actor-thought you>>
She says "walk normal" as if the cage does not shift with every other step. You nod, and she turns toward class without waiting for an answer.
<</actor-thought>>
<</if>>
<</nobr>>
<div id="conv"></div>
<<if $caged>>
<div id="options">
<<you-choice "Walk beside her like nothing changed.">>
<<actor girlfriend>>
See? You remember how to act normal.
I have the key, but class is still class, so don't make it weird.
<</actor>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<run setup.nudgeArousal(6)>>
<<include "School 26 Day anwo class">>
<</you-choice>>
<<you-choice "Mumble: do the others know?">>
<<actor girlfriend>>
The others? $bestfriendName knew before you did, and $bullyName guessed when you started walking like that.
The office added a supervision note this morning. Nobody's going to ask you out loud, but it isn't a secret anymore.
Except me. I care about the key.
<</actor>>
<<run setup.nudgeArousal(8)>>
<<include "School 26 Day anwo class">>
<</you-choice>>
<<you-choice "Can we talk about last night?">>
<<actor girlfriend>>
We're not discussing last night in the hallway. We have rules now, and you know what they are.
We can talk at home, so get to class.
<</actor>>
<<run setup.nudgeArousal(10)>>
<<include "School 26 Day anwo class">>
<</you-choice>>
</div>
<<else>>
<div id="options">
<<you-choice "Head to class together.">>
<<actor girlfriend>>
See you after class, and behave until then.
<</actor>>
<<run setup.nudgeArousal(4)>>
<<include "School 26 Day anwo class">>
<</you-choice>>
</div>
<</if>><<nobr>>
<img class="hero-img centered" @src="setup.ImagePath+'story/act1/day26-hierarchy-lecture.jpg'" alt="The teacher presenting the hierarchy lecture">
<<actor teacher>>
I see everyone made it. Today we will continue examining how rank affects group behavior.
<</actor>>
<<if $caged>>
<<actor teacher>>
The council has also added your current supervision status to the public recognition record, $youName. Check the board after class.
<</actor>>
<</if>>
<<if $caged>>
<<actor-thought you>>
You sit locked while she lectures about rank and group behavior. Someone behind you coughs.
It is $bullyName. He keeps his eyes forward, which makes you wonder whether the sound was deliberate.
<</actor-thought>>
<</if>>
<<actor bully>>
Council updated the rankings over the weekend. Some people climbed. You should probably check where you ended up.
<</actor>>
<<if setup.classRankingHasUpdate()>>
<<actor bestfriend>>
The board changed again. $youName, you might want to look. Or not. Depends on how much honesty you can handle today.
<</actor>>
<<else>>
<<actor bestfriend>>
Nothing changed, which is somehow worse. You're exactly where you were.
<</actor>>
<</if>>
<<actor teacher>>
$girlfriendName, $exfriendName, $bullyName. Your project is due next week. Make sure all five members contribute equally.
<</actor>>
<<actor exfriend>>
Equally. Sure.
<</actor>>
<<actor bestfriend>>
He said "equally" like he's never seen a group project before. Classic.
<</actor>>
<<if $flags.ultimateHumiliationDone>>
<<actor-thought you>>
$bullyName was in your living room. He was in your bed. Now he is two seats away, listening to the project deadline like that night required no more effort than homework.
Only you and $girlfriendName know what happened there, yet sitting near him is enough to make your cock press harder against the cage.
<</actor-thought>>
<<elseif $caged>>
<<actor-thought you>>
You look at $exfriendName and wonder what he sees when he looks at you now.
Probably the same thing he always saw. A plus-one. A wallet. A boyfriend with a deadline.
<</actor-thought>>
<</if>>
<<run setup.peakArousal()>>
<<set $flags.day26Done = true>>
<<set $flags.questHint = "Check the ranking board. After school.">>
<p class="delayed">After class, $girlfriendName catches your arm at the door. Quick. Before anyone notices.</p>
<<actor girlfriend>>
You did fine, so relax on the way out.
And... don't forget that Friday's coming.
<</actor>>
<<if ($flags.fridayDateStage || 0) gte 4>>
<<actor-thought you>>
Friday could belong to $bullyName, the ex, or both of them. You stopped counting whose turn it is.
She counts. She always counts.
<</actor-thought>>
<<else>>
<<actor-thought you>>
Friday. She says it like a date. You know it's a calendar slot you can't control.
<</actor-thought>>
<</if>>
<</nobr>>
<div class="continue-links">
<<if setup.classRankingHasUpdate()>>
[[Check the ranking board|Class board]]
<</if>>
[[Leave school|After school]]
</div><<nobr>>
<<if !$flags.phone1Read>>
<<set $flags.questHint = "Open your Phone and read the group chat before school will move on.">>
<<actor-thought you>>
I should read my phone messages first. Home will keep reminding me.
<</actor-thought>>
<div class="continue-links">
[[Go home and check Phone|Home][$schoolDay = 3; $gameDate = setup.changeDate($gameDate, 'hours', 2)]]
</div>
<<else>>
<<set $flags.questHint = "">>
<<actor exfriend>>
Hey, I finished the survey draft. You wanna have a look?
<</actor>>
<div class="continue-links">
[[Start Survey]]
</div>
<</if>>
<</nobr>><<nobr>>
<img class="hero-img centered" @src="setup.ImagePath+'story/act1/day3-survey-laptop.jpg'" alt="ANWO survey on laptop">
<p class="letter-head">ANWO survey</p>
<p class="letter">Welcome to the ANWO (Alpha New World Order) survey. Your feedback is important and will help us understand different perspectives on ANWO. Please answer the following questions honestly and to the best of your ability.</p>
[[Start Survey|Section 1]]
<</nobr>><<nobr>>
<<set $score to 0>>
<p class="letter-head">ANWO survey</p>
<p class="letter">How familiar are you with the concept of ANWO?<br><br>
[['Very familiar'|Q2][$score+= 1]]<br>
[['Somewhat familiar'|Q2][$score+= 0]]<br>
[['Not familiar at all'|Q2][$score+= -1]]
</p>
<</nobr>><<nobr>>
<p class="letter-head">ANWO survey</p>
<p class="letter">Do you agree with the idea that alpha males should dominate in society?<br><br>
[['Strongly agree'|Q3][$score+= 2]]<br>
[['Agree'|Q3][$score+= 1]]<br>
[['Neutral'|Q3][$score+= 0]]<br>
[['Disagree'|Q3][$score+= -1]]<br>
[['Strongly disagree'|Q3][$score+= -2]]
</p>
<</nobr>><<nobr>>
<p class="letter-head">ANWO survey</p>
<p class="letter">
What are the potential benefits of ANWO? (Check all that apply)<br><br>
Stronger leadership <<checkbox "$answer1" false true>><br>
Increased societal efficiency <<checkbox "$answer2" false true>><br>
Better decision-making <<checkbox "$answer3" false true>><br>
Improved discipline <<checkbox "$answer4" false true>><br>
No benefits <<checkbox "$answer5" false true>>
</p>
<<button [[Next|Q4]]>>
<<if $answer1>><<set $score += 2>><</if>>
<<if $answer2>><<set $score += 2>><</if>>
<<if $answer3>><<set $score += 2>><</if>>
<<if $answer4>><<set $score += 2>><</if>>
<<if $answer5>><<set $score -= 2>><</if>>
<</button>>
<</nobr>><<nobr>>
<p class="letter-head">ANWO survey</p>
<p class="letter">
What are the potential drawbacks of ANWO? (Check all that apply)<br><br>
Increased bullying <<checkbox "$answer1" false true>><br>
Social division <<checkbox "$answer2" false true>><br>
Gender inequality <<checkbox "$answer3" false true>><br>
Suppression of beta males <<checkbox "$answer4" false true>><br>
None <<checkbox "$answer5" false true>>
</p>
<<button [[Next|Q5]]>>
<<if $answer1>><<set $score -= 2>><</if>>
<<if $answer2>><<set $score -= 2>><</if>>
<<if $answer3>><<set $score -= 2>><</if>>
<<if $answer4>><<set $score -= 2>><</if>>
<<if $answer5>><<set $score += 2>><</if>>
<</button>>
<</nobr>><<nobr>>
<p class="letter-head">ANWO survey</p>
<p class="letter">
Do you think ANWO would positively or negatively affect your life personally?<br><br>
[['Positively'|Q6][$score+= 2]]<br>
[['Neutral'|Q6][$score+= 0]]<br>
[['Unsure'|Q6][$score+= 0]]<br>
[['Negatively'|Q6][$score+= -2]]
</p>
<</nobr>><<nobr>>
<p class="letter-head">ANWO survey</p>
<p class="letter">
Do you believe that the concept of ANWO has a place in the future of society?<br><br>
[['Yes'|Survey End][$score+= 2]]<br>
[['Unsure'|Survey End][$score+= 0]]<br>
[['No'|Survey End][$score+= -2]]
</p>
<</nobr>><<nobr>>
<p class="letter-head">ANWO survey Result</p>
Thank you for your participation. Let's see how your responses score!<br><br>
Your total score is: <<print $score>><br><br>
<<if $score > 1>>
Your overall sentiment towards ANWO is positive.<br>
Your feedback suggests that ANWO could offer benefits aligned with enhanced leadership and societal effectiveness. Your perspective on the potential advantages of ANWO indicates optimism about its potential impact. Thank you once again for sharing your thoughts and insights!
<<elseif $score < -10>>
Your overall sentiment towards ANWO is negative.<br>
Your feedback highlights reservations about ANWO, particularly regarding its implications for societal dominance and leadership dynamics. Your perspective suggests skepticism about the potential benefits and the overall impact of ANWO.<br>
Thank you for sharing your insights and contributing to our understanding of diverse viewpoints on ANWO.
<<else>>
Your overall sentiment towards ANWO is neutral.<br>
Your feedback indicates a balanced view regarding ANWO. You acknowledge potential benefits associated with the concept while maintaining a neutral stance on its broader implications. Thank you for sharing your insights and contributing to our understanding of diverse perspectives on ANWO.
<<endif>><br><br>
Thank you for your time and participation!<br><br>
[[Restart Survey | Start Survey]]<br>
[[Discuss Survey]]
<</nobr>><<nobr>>
<<set $flags.day3SurveyDone = true>>
<<set $flags.questHint = "">>
<<actor you>>
I think this survey is rigged to favor ANWO.
<</actor>>
<<actor you>>
The disagree options are there, but the scoring calls almost anything "neutral," and "neutral" ends up counting as support. That's not balanced.
<</actor>>
<<actor exfriend>>
Yeah, but we need results $teacherName will accept, or the grade tanks.
<</actor>>
<<actor girlfriend>>
Just do your two. We can argue ethics after the A.
<</actor>>
<<actor bully>>
Man wants to fix the form. Just submit it.
<</actor>>
<<actor-thought you>>
If anyone reads the raw answers, my "neutral" is going to read as approval.
<</actor-thought>>
<div class="continue-links">
[[Leave school|After school]]
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/day31-data-audit.jpg'" alt="The group checking survey data on a laptop">
<<actor teacher>>
Before anyone builds a final deck, audit the source data. If a total cannot be traced to an interview, it does not go on a council slide.
<</actor>>
<p class="scene-lead delayed">$teacherName's back is turned at the front, and at your group table one column is wrong. Twelve answers from your park interviews were pasted into the school sample. The result came out tidier than it had any right to be.</p>
<<actor exfriend>>
That is not my formula. The source tab changed after I checked it. Maybe someone else touched the sheet.
<</actor>>
<<actor bully>>
Can we just fix it without the trial? I got a reputation to protect, not a courtroom.
<</actor>>
<<actor girlfriend>>
He has the original notes. Let him check the rows. Quietly, please.
<</actor>>
<<actor-thought you>>
For once the whole table waits on you. $girlfriendName presses her knee against yours under the desk, a private distraction while the evidence on the screen remains yours to explain.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "Correct the sample and explain every changed row.">>
<<set $flags.day31DataAuditDone = true>>
<<set $flags.day31Contribution = "corrected">>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<actor exfriend>>You're right. Those twelve belong in the field sample. I'll rerun the totals.<</actor>>
<<actor girlfriend>>Good catch. Put your name on the audit note. You did the work, so claim it. Maybe I reward that confidence later.<</actor>>
<div class="delayed continue-links">[[Leave school|After school]]</div>
<</you-choice>>
<<you-choice "Show him the rows and let him present the correction.">>
<<set $flags.day31DataAuditDone = true>>
<<set $flags.day31Contribution = "shared">>
<<actor exfriend>>Okay. I see it. I'll fix the sheet, but your interview notes stay attached.<</actor>>
<<actor girlfriend>>Fine. Shared fix, shared credit. Just don't disappear from your own work again, baby. I still expect your attention later.<</actor>>
<div class="delayed continue-links">[[Leave school|After school]]</div>
<</you-choice>>
<<you-choice "Quietly repair the totals before anyone argues.">>
<<set $flags.day31DataAuditDone = true>>
<<set $flags.day31Contribution = "quiet">>
<<actor bully>>Numbers moved. We good now? Nice ghost trick, man.<</actor>>
<<actor girlfriend>>We're good. Next time say you fixed it, baby. Nobody credits a ghost. The key still stays with me.<</actor>>
<div class="delayed continue-links">[[Leave school|After school]]</div>
<</you-choice>>
</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/day34-hallway-talk.jpg'" alt="Jenny speaking privately with her boyfriend in the school hallway">
<<set _contribution = $flags.day31Contribution || "legacy">>
<p class="scene-lead">$girlfriendName catches your sleeve outside the library and waits until the others round the corner.</p>
<<if _contribution eq "corrected">>
<p class="scene-lead">Your name is already on the audit note.</p>
<<elseif _contribution eq "shared">>
<p class="scene-lead">$exfriendName attached both names to the correction, but the presentation still needs to show who found the bad rows.</p>
<<elseif _contribution eq "quiet">>
<p class="scene-lead">The totals are fixed, but the draft does not say who found the problem.</p>
<<else>>
<p class="scene-lead">The field section still needs a name beside the correction.</p>
<</if>>
<<actor girlfriend>>
$exfriendName reran the totals. Your interview notes saved the field section.
<<if _contribution eq "corrected">>You claimed the correction, so I kept your name on it.<<elseif _contribution eq "shared">>He gets credit for rerunning the sheet. You still get credit for finding the bad rows.<<elseif _contribution eq "quiet">>You fixed it and nearly let the draft erase you. I am not letting that happen by accident.<<else>>I can make the slide say that.<</if>>
When someone asks about it, you answer. I can help you prepare, but I can't do your part for you.
<</actor>>
<<actor-thought you>>
There is no audience down this hall and no $bestfriendName waiting to laugh. $girlfriendName steps closer, the key feels cold against your collarbone, and she waits for you to claim the work out loud.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "Put my audit credit on the slide.">>
<<set $flags.day34PresentationTalkDone = true>>
<<set $flags.day34JennyStance = "credit">>
<<actor girlfriend>>I will. Your name, your interviews, your correction. Then you answer for it in front of the room. Don't make me look stupid for trusting you.<</actor>>
<div class="delayed continue-links">[[Go back to class|After school]]</div>
<</you-choice>>
<<you-choice "I want us to present that section together.">>
<<set $flags.day34PresentationTalkDone = true>>
<<set $flags.day34JennyStance = "together">>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<actor girlfriend>>Okay. I introduce the field section, then you take the question. Together means you still talk, baby. Do it well and I will reward you tonight.<</actor>>
<div class="delayed continue-links">[[Return to class with her|After school]]</div>
<</you-choice>>
<<you-choice "Manage the slide. I won't freeze when you give me the question.">>
<<set $flags.day34PresentationTalkDone = true>>
<<set $flags.day34JennyStance = "managed">>
<<actor girlfriend>>Then listen for my cue. I can give you the opening, not the answer. After that, your voice has to carry the rest.<</actor>>
<div class="delayed continue-links">[[Follow her back to class|After school]]</div>
<</you-choice>>
</div>
</div>
<</nobr>><<nobr>>
<<set _fridayStage = $flags.fridayDateStage || 0>>
<img class="hero-img centered" @src="setup.ImagePath+'story/act2/day35-jenny-s42.png'" alt="Jenny at classroom desk">
<<actor teacher>>
Groups, final push. Your project presentations are coming up. Use today to coordinate.
<</actor>>
<<actor bully>>
I'll open. $exfriendName has the totals, and $girlfriendName has the main argument.
The field section is yours, $youName. You caught the sample error, so you can explain it.
<</actor>>
<<actor bestfriend>>
Look at him getting an actual speaking part. Try not to make $girlfriendName regret it.
<</actor>>
<<actor girlfriend>>
Your corrected notes are already in the deck.
Bring the handouts too, but the field answer is yours. Don't hide from it.
<</actor>>
<<actor-thought you>>
She checks the key against her blouse while she talks. $bestfriendName follows your eyes and grins.
<</actor-thought>>
<p class="delayed">Break time. $bestfriendName leans across the table, voice carrying one decibel too loud.</p>
<<actor bestfriend>>
<<if _fridayStage gte 6>>
So... Friday. $bullyName, $exfriendName, or both again? I need to know how many drinks he is buying.
<<elseif _fridayStage gte 5>>
So... they both get a Friday now. Did he pay for both dates too?
<<elseif _fridayStage gte 4>>
So... $bullyName got his Friday. Is $exfriendName next? Look at him pretending he doesn't want to know.
<<elseif _fridayStage gte 1>>
So... how much has Friday cost him so far? He goes quiet every time you mention the bill.
<<else>>
So... did $girlfriendName show you her Friday plan yet? $bullyName, $exfriendName, maybe both. You get the house.
<</if>>
<</actor>>
<<actor girlfriend>>
$bestfriendName. Not here.
<</actor>>
<<actor bestfriend>>
<<if _fridayStage gte 1>>
I'm asking because his wallet keeps coming with you. He can answer.
<<else>>
You told me the plan at breakfast. Blame yourself for giving me material.
<</if>>
<</actor>>
<<actor exfriend>>
Can we not do this in public?
<</actor>>
<<actor bestfriend>>
You should see his face. He knows everyone heard me.
<</actor>>
<<actor-thought you>>
Someone three tables away looks over <<if _fridayStage gte 4>>when $bestfriendName says both names<<elseif _fridayStage gte 1>>when $bestfriendName mentions your wallet<<else>>when $bestfriendName lists her plans<</if>>. You stare down at your notes.
<<if _fridayStage gte 4>>
She is laughing about nights that already happened, and your face gives her every answer she wants.
<<elseif _fridayStage gte 1>>
You paid for Friday. Nobody else at this table needed to hear that.
<<else>>
None of those nights has happened yet, but $bestfriendName says it like the plans are settled.
<</if>>
<</actor-thought>>
<<run setup.nudgeArousal(12)>>
<</nobr>>
<div id="conv"></div>
<div id="options">
<<you-choice "Put your head down and wait for it to pass.">>
<<set $flags.day35PublicHumiliationDone = true>>
<<run setup.applyRecognition("owned-day35-head-down")>>
<<actor girlfriend>>
Hey. Look at me.
$bestfriendName is being loud because she knows you'll react.
<<if _fridayStage gte 1>>Friday still costs money, and it is still yours.<<else>>The plan stays private until I say otherwise.<</if>>
Now stop sulking and act normal.
<</actor>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<run setup.nudgeArousal(8)>>
<p class="delayed">The bell rings. Nobody else mentions it. Everyone heard it.</p>
<div class="continue-links">
<<if setup.classRankingHasUpdate()>>
[[Check the ranking board|Class board]]
<</if>>
[[Leave school|After school]]
</div>
<</you-choice>>
<<identity-choice resistance "Say: she said plans, not permission to announce them.">>
<<set $flags.day35PublicHumiliationDone = true>>
<<actor bestfriend>>
Oh, he finally found a boundary. Took you long enough.
<</actor>>
<<actor bully>>
Fair complaint. About ten minutes late, but fair.
<</actor>>
<<run setup.applyIdentity("owned-day35-boundary")>>
<<run setup.applyRecognition("owned-day35-boundary")>>
<<run setup.nudgeArousal(10)>>
<<actor girlfriend>>
Don't start fights you can't finish, baby.
Class. Now. We'll talk about what $bestfriendName gets to repeat at home.
<</actor>>
<div class="continue-links">
<<if setup.classRankingHasUpdate()>>
[[Check the ranking board|Class board]]
<</if>>
[[Leave school|After school]]
</div>
<</identity-choice>>
<<you-choice "Laugh along. Fake it.">>
<<set $flags.day35PublicHumiliationDone = true>>
<<actor bestfriend>>
He's laughing now. Give him ten minutes and he'll be hiding in his notes again.
<</actor>>
<<actor girlfriend>>
You're forcing that laugh so hard, baby.
Just breathe and get through class.
<</actor>>
<<run setup.applyRecognition("owned-day35-laugh")>>
<<run setup.peakArousal()>>
<div class="continue-links">
<<if setup.classRankingHasUpdate()>>
[[Check the ranking board|Class board]]
<</if>>
[[Leave school|After school]]
</div>
<</you-choice>>
</div><<nobr>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/day37-hidden-slide.jpg'" alt="Tom with a buzz cut and Jamal stand behind the MC at a laptop showing the hidden chastity-key slide, Alessia leaving through the door">
<<set _fridayStage = $flags.fridayDateStage || 0>>
<p class="scene-lead">Rehearsal ends. The laptop is still on. $bestfriendName steps out to take a phone call, leaving private material she never showed the group. A slide displays $girlfriendName's chastity key beneath the word <em>MANAGED</em>. <<if _fridayStage gte 1>>The thumbnail beside it is a duplicate <strong>FIELD EXPENSES</strong> slide with your Friday receipts mixed into the project costs. Neither edit was approved. If they survive into the final deck, the whole class sees them on presentation day.<<else>>The slide was never approved. If it survives into the final deck, the whole class sees it on presentation day.<</if>></p>
<<actor exfriend>>
That is not project evidence. If she submits <<if _fridayStage gte 1>>those edits<<else>>that slide<</if>>, the council gets the whole deck, and we all look like a joke.
<</actor>>
<<actor bully>>
Funny slide. Bad grade. Those can both be true at once. Maybe they finally learn who actually wears the pants.
<</actor>>
<<actor-thought you>>
$bestfriendName could walk back any second. You have maybe a minute. The cage sits cold around your soft cock while you stare at the key on the screen, bigger than the real one on $girlfriendName's chest. You could warn her now. You could photograph what changed and preserve the edit history. Or you could say nothing and let presentation day decide how many people see proof that you are locked on a council slide.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "I want you to see this now and remove everything.">>
<<set $flags.day37SlideDecision = "warn">>
<<actor girlfriend>>She used the shared folder after I locked the deck. Okay. I'll remove every private edit and watch the final upload myself.<</actor>>
<<actor bestfriend>>You ran to her before I got back? Good little hall monitor. At least $girlfriendName knows who carries her problems now.<</actor>>
<div class="delayed continue-links">[[Leave after rehearsal|After school]]</div>
<</you-choice>>
<<you-choice "I'm saving the draft and its edit history.">>
<<set $flags.day37SlideDecision = "document">>
<<actor exfriend>>Good. If any of it appears, we can prove it was added after approval.<</actor>>
<<actor bestfriend>>You saved the edit history? Cute. Maybe the approval log can explain why $girlfriendName has to manage you too.<</actor>>
<div class="delayed continue-links">[[Pocket your phone and leave|After school]]</div>
<</you-choice>>
<<you-choice "I'm leaving it alone. I won't say anything.">>
<<set $flags.day37SlideDecision = "leave">>
<<actor bestfriend>>There it is. You hate the slide, but you still want to know how it lands. So keep quiet.<</actor>>
<<actor girlfriend>>$bestfriendName, close it. We're done for today.<</actor>>
<p class="delayed">$bestfriendName closes the preview. The shared-folder icon flashes once before the laptop shuts, and you leave without asking which copy she saved.</p>
<div class="delayed continue-links">[[Go home without warning anyone|After school]]</div>
<</you-choice>>
</div>
</div>
<</nobr>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/day39-field-rehearsal.jpg'" alt="Jenny passing the field question to her boyfriend during rehearsal">
<<set _slideDecision = $flags.day37SlideDecision || "legacy">>
<<set _jennyStance = $flags.day34JennyStance || "legacy">>
<<if _slideDecision eq "warn">>
<p class="scene-lead">$girlfriendName has the clicker now. $bestfriendName is allowed to watch the deck, not edit it.</p>
<<actor bestfriend>>He warned her, she locked the file, and now we all get the boring approved version. Happy?<</actor>>
<<elseif _slideDecision eq "document">>
<p class="scene-lead">$exfriendName checks the edit-history photo against the approval log before the teacher starts.</p>
<<actor exfriend>>I attached your screenshot to the approval log. If her slide returns, the timestamp settles it.<</actor>>
<<elseif _slideDecision eq "leave">>
<p class="scene-lead">$bestfriendName sits nearest the laptop. The hidden slide is still somewhere in the deck, and $exfriendName keeps glancing toward her hand.</p>
<<actor exfriend>>If that private slide appears tomorrow, I am telling the council it was never approved.<</actor>>
<</if>>
<<actor teacher>>
One rehearsal question. Why did the park interviews differ from the classroom sample?
<</actor>>
<p class="scene-lead delayed">$bullyName looks toward the slide. $exfriendName looks toward the corrected sheet. $girlfriendName looks directly at you, one finger resting on the key at her collarbone, and under the table her other hand cups your locked cock through your jeans, squeezing once, slow.</p>
<<actor girlfriend>>
<<if _jennyStance eq "credit">>You asked for your name on this section. Take the question yourself.<<elseif _jennyStance eq "together">>We agreed to present this together. I open, then you explain the correction.<<elseif _jennyStance eq "managed">>I am handing you the question exactly like I promised. Take it.<<else>>Those are your interviews, so this is your answer.<</if>>
Show me what you are putting on the screen tomorrow. Speak up.
<</actor>>
<span id="conv"></span>
<div id="options">
<<you-choice "Explain the sampling difference and the corrected totals.">>
<<set $flags.day39RehearsalDone = true>>
<<set $flags.day39RehearsalResult = "answered">>
<<actor teacher>>Good. Use that answer tomorrow. It is specific, supported, and yours.<</actor>>
<<actor girlfriend>>See? Keep that exact voice when the room is full. That's the only part of you that has to perform. Your cock stays locked through every word.<</actor>>
<div class="delayed continue-links">[[Finish rehearsal|After school]]</div>
<</you-choice>>
<<you-choice "Start the answer, then ask him to confirm the totals.">>
<<set $flags.day39RehearsalDone = true>>
<<set $flags.day39RehearsalResult = "shared">>
<<actor exfriend>>The corrected totals support his explanation. The samples were collected in different settings.<</actor>>
<<actor teacher>>Shared answer, but a valid one. Lead with your observation tomorrow.<</actor>>
<<actor girlfriend>>Shared mic, fine. Just don't lean on him when the room goes quiet. I hand you the question, you carry it. I keep your cock key, no handing that off.<</actor>>
<div class="delayed continue-links">[[Pack the laptop|After school]]</div>
<</you-choice>>
<<you-choice "Lose the first sentence and let her step in.">>
<<set $flags.day39RehearsalDone = true>>
<<set $flags.day39RehearsalResult = "froze">>
<<actor girlfriend>>The park group answered without classmates watching. That's why the response shifted.<br>Baby, breathe. Tomorrow I give you the question once. You take it, or you take it locked. I ride your tongue either way, your cock waits.<</actor>>
<div class="delayed continue-links">[[Leave the empty room with her|After school]]</div>
<</you-choice>>
</div>
</div>
<</nobr>><<nobr>>
<<set $storyAct = 3>>
<<set $storyBeat = "final-ranking">>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/day40-class-arrival.jpg'" alt="the project group preparing for the final presentation">
<<actor teacher>>
Final presentations begin today. The council will post the class's final ranking for this project cycle after the last group.
Your evaluation will include the slides, division of work, and results. The provisional period ends this afternoon.
<</actor>>
<<actor-thought you>>
The key rests against $girlfriendName's blouse. $bullyName stands beside the screen. $exfriendName has the laptop.
You grip the handouts with both hands. The cage rubs against you with every step toward the front.
<</actor-thought>>
<<actor bully>>
Slides are ready. $exfriendName has the numbers. $girlfriendName talks.
$youName, take the field question. You fixed the sample, so do not hand it back to us.
<</actor>>
<<actor bestfriend>>
He got promoted from paper delivery to one whole answer. Try not to celebrate early.
<</actor>>
<div class="continue-links delayed">[[Take your place beside the screen|Day 40 Presentation]]</div>
</div>
<</nobr>><<nobr>>
<<set _fridayStage = $flags.fridayDateStage || 0>>
<<set _slideDecision = $flags.day37SlideDecision || "legacy">>
<<set _rehearsal = $flags.day39RehearsalResult || "legacy">>
<<set _contribution = $flags.day31Contribution || "legacy">>
<<set _jennyStance = $flags.day34JennyStance || "legacy">>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/day40-final-ranking.jpg'" alt="the group leader presenting the final project">
<p class="scene-lead">$girlfriendName takes the center without asking for it. $bullyName opens with the argument, $exfriendName explains the totals, and then your corrected field sample appears with your name beside it.</p>
<<actor girlfriend>>
Our group worked because the jobs were clear. $bullyName led the pitch, $exfriendName organized the data, and $youName collected the field interviews.
<<if _contribution eq "corrected" || _jennyStance eq "credit">>He found and documented the sample error. The correction belongs to him.<<elseif _contribution eq "shared" || _jennyStance eq "together">>He found the bad rows, and $exfriendName reran the totals. The correction credit is shared.<<elseif _contribution eq "quiet">>He repaired the sample before the draft named him. The audit note now records that work.<<else>>He caught the sample error, and the correction belongs to him.<</if>>
I managed the final report.
<</actor>>
<<actor bestfriend>>
<<if _slideDecision eq "warn">>You deleted my last slide. I still want to see if you caught every copy.<<else>>Get to my last slide, the honest one.<</if>>
<</actor>>
<<actor girlfriend>>
<<if _slideDecision eq "warn">>The upload is locked. We are presenting the work now.<<else>>Not yet, $bestfriendName. We are presenting the work first.<</if>>
<</actor>>
<p class="delayed">The role table is plain: pitch, data, report, field research. Your name is beside the interviews and the correction note. Nobody can call it equal work, but nobody can call it imaginary either.</p>
<<actor-thought you>>
<<if _rehearsal eq "answered">>You give the answer from rehearsal without losing the first sentence. The teacher nods before you finish.<<elseif _rehearsal eq "shared">>You explain the sampling difference, then let $exfriendName confirm the totals. It is still your observation on the screen.<<elseif _rehearsal eq "froze">>The first sentence catches again. $girlfriendName says your name once, and this time you force the answer out.<<else>>The council asks about the sample correction. You answer from your notes while $girlfriendName waits beside the screen.<</if>>
The cage shifts when you pick up the handouts, but the question had nothing to do with it.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "I'll present the corrected field result myself.">>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<actor girlfriend>>
Good. Clear answer. Now let the work stand.
<</actor>>
<div class="delayed">
<<if _fridayStage gte 1 && _slideDecision neq "warn">>[[Wait for the evidence slide|Day 40 Friday slide]]<<else>>[[Wait for the council framework|Day 40 Hierarchy slide]]<</if>>
</div>
<</you-choice>>
<<you-choice "Take the question with me.">>
<<actor girlfriend>>I set up the result. You explain why it changed. We can share a microphone without sharing every sentence.<</actor>>
<div class="delayed">
<<if _fridayStage gte 1 && _slideDecision neq "warn">>[[Continue to the expense slide|Day 40 Friday slide]]<<else>>[[Continue to the council framework|Day 40 Hierarchy slide]]<</if>>
</div>
<</you-choice>>
<<you-choice "I'll give the short answer and return to the handouts.">>
<<actor teacher>>Concise, but correct. The audit note will remain attached to the final report.<</actor>>
<div class="delayed">
<<if _fridayStage gte 1 && _slideDecision neq "warn">>[[Let the expense slide load|Day 40 Friday slide]]<<else>>[[Let the council framework load|Day 40 Hierarchy slide]]<</if>>
</div>
<</you-choice>>
</div>
</div>
<</nobr>><<nobr>>
<<set _fridayStage = $flags.fridayDateStage || 0>>
<<set _slideDecision = $flags.day37SlideDecision || "legacy">>
<<if _fridayStage lt 1 || _slideDecision eq "warn">>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/day40-presentation-friday.jpg'" alt="the approved field expenses slide">
<p class="scene-lead">The approved expense summary contains only project costs. There are no private Friday receipts to present.</p>
<div class="continue-links">[[Continue to the council framework|Day 40 Hierarchy slide]]</div>
</div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/day40-presentation-friday.jpg'" alt="The field expenses slide with private Friday receipts hidden between legitimate project costs">
<p class="scene-lead">The next slide is labeled <strong>FIELD EXPENSES.</strong> It should contain transit and survey costs. $bestfriendName has tucked your private Friday receipts between the legitimate entries.</p>
<<actor girlfriend>>
Those Friday receipts are real, but they are not project expenses.
$bestfriendName, you had access to the shared folder for formatting. Not this.
<</actor>>
<<actor bestfriend>>
Shared folder means shared evidence. I only highlighted the pattern.
<</actor>>
<<if _slideDecision eq "document">>
<<actor-thought you>>The edit-history photo on your phone shows exactly when she inserted this slide. The same record covers the key photo waiting later in the deck.<</actor-thought>>
<</if>>
<<actor bully>>
<<if _fridayStage gte 6>>
The numbers check out. Separate dinners, both names, then one ninety-dollar Friday. That's a pattern.
<<elseif _fridayStage gte 5>>
The numbers check out. He paid for my Friday and $exfriendName's. Separate receipts, same wallet.
<<elseif _fridayStage gte 4>>
That one is mine. He paid, she went out, everybody got home. Successful expense.
<<elseif _fridayStage gte 3>>
Three dinners with his keyholder, and he covered every one. Embarrassing budget.
<<elseif _fridayStage gte 2>>
One normal date, then one with the key on the table. He paid for both.
<<else>>
One dinner with his girlfriend. Embarrassing receipt to project, but not exactly a conspiracy.
<</if>>
<</actor>>
<<actor-thought you>>
You recognize every amount because it came out of your wallet. A student near the window follows one highlighted row, then looks from you to $bullyName.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "I'll keep handing out sheets and not look at the screen.">>
<<run setup.applyRecognition("final-receipts-silent")>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<actor girlfriend>>
Stay focused. I will deal with the slide. You finish the sheets.
<</actor>>
<div class="delayed">[[Continue to the council framework|Day 40 Hierarchy slide]]</div>
<</you-choice>>
<<identity-choice resistance "Say: those are private receipts, not project data.">>
<<run setup.applyIdentity("final-receipts-private")>>
<<run setup.applyRecognition("final-receipts-private")>>
<<actor bestfriend>>
Correct. Full sentence, eye contact, everything. Shame it took a projector.
<</actor>>
<<actor bully>>
He is right. Those are his receipts. Still funny, though.
<</actor>>
<<if _slideDecision eq "document">>
<<actor you>>I saved the edit history. She added this after the group approved the deck.<</actor>>
<<actor teacher>>The approval log already contains your record. Continue. This slide will not count toward the group evaluation.<</actor>>
<</if>>
<div class="delayed">[[Make her continue to the council framework|Day 40 Hierarchy slide]]</div>
<</identity-choice>>
<<you-choice "Confirm that you paid the highlighted receipts.">>
<<run setup.applyRecognition("final-receipts-confirm")>>
<<run setup.peakArousal()>>
<<actor girlfriend>>
Clear answer. No extra details. Let me handle the rest.
<</actor>>
<div class="delayed">[[Face the council framework|Day 40 Hierarchy slide]]</div>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<set _youRank = setup.getPlayerClassRank()>>
<<set _slideDecision = $flags.day37SlideDecision || "legacy">>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/day40-presentation-hierarchy.jpg'" alt="The hierarchy slide showing the class ranking structure">
<p class="scene-lead">The screen refreshes to the council's project-role chart: leadership, organization, management, and field support. The current class ranking appears in a separate column.</p>
<<actor girlfriend>>
This is how the council divided the project roles.
$bullyName led the pitch. $exfriendName organized the data. I managed the report.
$youName handled field support. <<if _youRank>>His current classification is <<print _youRank.band>> at rank #<<print _youRank.rank>>.<<else>>The council is still calculating his classification.<</if>>
<</actor>>
<<actor bully>>
<<if _youRank and _youRank.rank eq 1>>Field support and first overall. Did not expect that line to land above mine.<<elseif _youRank and _youRank.isAlpha>>Field support with an Alpha score. Weird combination, but the board counted it.<<else>>Field support in the Beta half. Rough place to stand next to the screen.<</if>>
<</actor>>
<<actor bestfriend>>
Everyone's looking at him now.
<<if _youRank and _youRank.isAlpha>><<if _slideDecision eq "warn">>Alpha on the form, and he got my private edits killed before class. Responsible boy.<<else>>Alpha on the form, keyholder photo on the next slide. This presentation has range.<</if>><<else>><<print _youRank ? _youRank.band : "Beta">>. They put that on an actual council form.<</if>>
<</actor>>
<<actor exfriend>>
The interviews are his. The support score is low because the deadlines were late. That is what the sheet says.
<</actor>>
<<actor-thought you>>
<<if _youRank>>Your name is #<<print _youRank.rank>>, followed by <em><<print _youRank.band>>.</em><<else>>Your name flickers while the board refreshes.<</if>> Students turn toward you, then toward $girlfriendName and the key on her blouse.
Your face burns before anyone says a word.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "I'll stand still and let the room see the chart.">>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<div class="delayed"><<if _slideDecision eq "warn">>[[Wait for the approved summary|Day 40 Honest slide]]<<else>>[[Wait for the last slide|Day 40 Honest slide]]<</if>></div>
<</you-choice>>
<<you-choice "Say: the interviews should count for more.">>
<<run setup.applyIdentity("final-role-defend")>>
<<run setup.applyRecognition("final-role-defend")>>
<div class="delayed"><<if _slideDecision eq "warn">>[[Sit down before the approved summary|Day 40 Honest slide]]<<else>>[[Sit down before the honest slide|Day 40 Honest slide]]<</if>></div>
<</you-choice>>
<<you-choice "I'll read the council classification aloud.">>
<<run setup.applyIdentity("final-role-read")>>
<<run setup.applyRecognition("final-role-read")>>
<<run setup.peakArousal()>>
<div class="delayed"><<if _slideDecision eq "warn">>[[Let the approved summary replace it|Day 40 Honest slide]]<<else>>[[Let the classification settle|Day 40 Honest slide]]<</if>></div>
<</you-choice>>
</div>
</div>
<</nobr>><<nobr>>
<<set _slideDecision = $flags.day37SlideDecision || "legacy">>
<div class="scene-panel compact">
<<if _slideDecision eq "warn">>
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/day40-final-ranking.jpg'" alt="the group leader presenting the approved final summary">
<p class="scene-lead">$girlfriendName advances to the approved final summary. $bestfriendName presses the spare clicker once, but nothing changes. The locked deck contains only the group's work.</p>
<<actor girlfriend>>
The upload is locked. We are finishing with the work the group approved.
<</actor>>
<<actor bestfriend>>
Boring approved version. Your hall monitor wins this one.
<</actor>>
<<actor-thought you>>
The council sees the summary and your correction credit. Nothing from your private life follows them onto the screen.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "I'll finish the handouts and let the work stand.">>
<<set $flags.day40PresentationDone = true>>
<<set $flags.day40SlideChallenged = false>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<actor girlfriend>>Good. Take your seat.<</actor>>
<div class="delayed">[[Wait for the council result|Final ranking reveal]]</div>
<</you-choice>>
</div>
<<else>>
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/day40-presentation-honest.jpg'" alt="the unauthorized MANAGED slide showing the keyholder's chastity key">
<p class="scene-lead">$girlfriendName reaches for the final summary, but $bestfriendName clicks first. The hidden slide fills the screen with the key against $girlfriendName's blouse and one word beneath it: <strong>MANAGED.</strong></p>
<<actor girlfriend>>
$bestfriendName. That is not the summary slide.
That slide was never approved. Take it off the screen.
<</actor>>
<<actor bestfriend>>
The approved slide gives him credit. Mine shows who keeps him locked. One picture, one word. Much clearer.
<</actor>>
<<actor bully>>
That picture is private. It does not belong in a school presentation. Take it down.
<</actor>>
<<actor exfriend>>
Delete that slide before the council sees it or someone takes a screenshot.
<</actor>>
<<actor-thought you>>
The room goes quiet long enough for everyone to understand the key photo.
$girlfriendName closes the laptop. Several phones disappear under desks. She glares at $bestfriendName, then turns the same hard look on you.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "I'll finish the handouts. Close the slide.">>
<<set $flags.day40PresentationDone = true>>
<<set $flags.day40SlideChallenged = false>>
<<run setup.applyRecognition("final-honest-silent")>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<actor girlfriend>>
Good. Keep moving.
$bestfriendName and I will discuss her editing privileges later.
<</actor>>
<div class="delayed">[[Wait for the council result|Final ranking reveal]]</div>
<</you-choice>>
<<identity-choice resistance "Say: that slide was private and never approved.">>
<<set $flags.day40PresentationDone = true>>
<<set $flags.day40SlideChallenged = true>>
<<run setup.applyIdentity("final-honest-object")>>
<<run setup.applyRecognition("final-honest-object")>>
<<if _slideDecision eq "document">>
<<actor you>>The same edit history covers this slide. $bestfriendName added it after approval.<</actor>>
<<actor teacher>>I have the record. The private slide will not count toward your group evaluation.<</actor>>
<</if>>
<<actor bully>>
He is right about one thing. That was not project data.
<</actor>>
<<actor bestfriend>>
The approval log does not change whose key it is or whose lock you wear.
<</actor>>
<div class="delayed">[[Sit down before the council result|Final ranking reveal]]</div>
<</identity-choice>>
<<you-choice "The key photo is real. It was private and never belonged in this project.">>
<<set $flags.day40PresentationDone = true>>
<<set $flags.day40SlideChallenged = false>>
<<run setup.applyRecognition("final-honest-admit")>>
<<run setup.peakArousal()>>
<<actor girlfriend>>
That is enough. Look at me, baby, and stop helping $bestfriendName.
<</actor>>
<div class="delayed">[[Let the council replace the gossip|Final ranking reveal]]</div>
<</you-choice>>
</div>
<</if>>
</div>
<</nobr>><<nobr>>
<<set _rank = setup.getClassRanking()>>
<<set _youRank = setup.getPlayerClassRank()>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/day40-final-board-base.jpg'" alt="The teacher announcing the final result beside a neutral projection screen">
<<actor teacher>>
The council has approved the final list for this project cycle.
<<if _youRank and _youRank.rank eq 1>>Your name is ranked first at <<print _youRank.band>>, ahead of $bullyName.<<elseif _youRank and _youRank.isAlpha>>Your rank is #<<print _youRank.rank>>, classified as <<print _youRank.band>>.<<else>>Your rank is #<<print _youRank.rank>>, classified as <<print _youRank ? _youRank.band : "Beta">>.<</if>>
<<if $flags.day39RehearsalResult eq "answered">>You receive credit for the field audit in the final report. <</if>>$exfriendName's comparison score is on the board, and $girlfriendName receives a group management commendation.
<</actor>>
<p class="delayed">The room murmurs. Someone in the back row laughs, then stops. Three tables away, a girl looks at you, then at $girlfriendName, then back at her phone.</p>
<<actor bully>>
<<if _youRank and _youRank.rank eq 1>>You took the top line. Enjoy it. I am still reading the keyholder note out loud.<<elseif _youRank and _youRank.isAlpha>>Alpha score while locked. The council really likes complicated jokes.<<else>><<print _youRank ? _youRank.band : "Beta">>. That is rough after forty days of work. At least they spelled your name right.<</if>>
<</actor>>
<<actor bestfriend>>
The whole room heard that.
<<if _youRank and _youRank.isAlpha>>Now read our brave Alpha's classification. Please.<<else>>Read his Beta score too. Please.<</if>>
<</actor>>
<<actor girlfriend>>
"<<print _youRank ? _youRank.band : "Unclassified">>."
<<if _youRank and _youRank.rank eq 1>>Number one in public. Key still with me in private. Try to enjoy both facts, baby.<<else>>Don't make that face, baby. The council graded the project, not our relationship.<</if>>
...and I got a commendation. Be happy for me.
<</actor>>
<span id="conv"></span>
<div id="options">
<<if _youRank and _youRank.isAlpha>>
<<identity-choice resistance "Read your Alpha classification yourself.">>
<<set $flags.finalRankingSeen = true>>
<<set $flags.ownedPublicRoleAccepted = true>>
<<run setup.applyIdentity("final-label-claim")>>
<<actor you>><<print _youRank.band>>. Rank #<<print _youRank.rank>>.<</actor>>
<<actor girlfriend>>Clear voice. Keep it when we discuss the result at home.<</actor>>
<div class="delayed continue-links">[[Check the final board|Class board]] [[Go home|Home]]</div>
<</identity-choice>>
<<else>>
<<identity-choice devotion "Read the classification yourself.">>
<<set $flags.finalRankingSeen = true>>
<<set $flags.ownedPublicRoleAccepted = true>>
<<run setup.applyIdentity("final-label-read")>>
<<run setup.peakArousal()>>
<<actor you>><<print _youRank ? _youRank.band : "Beta">>.<</actor>>
<<actor girlfriend>>Clear voice. Everyone heard you.<</actor>>
<div class="delayed continue-links">[[Check the final board|Class board]] [[Go home|Home]]</div>
<</identity-choice>>
<</if>>
<<identity-choice resistance "Tell them the list is a joke.">>
<<set $flags.finalRankingSeen = true>>
<<set $flags.ownedPublicRoleAccepted = false>>
<<run setup.applyIdentity("final-label-reject")>>
<<set $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1)>>
<<actor girlfriend>>
You can hate the label. You still did the work they scored.
We'll talk at home, without a projector and without $bestfriendName editing the conversation.
<</actor>>
<<actor bestfriend>>
He waits until the final result to object. Great timing, loser.
<</actor>>
<div class="delayed continue-links">[[Check the final board|Class board]] [[Go home before the debrief|Home]]</div>
<</identity-choice>>
<<identity-choice devotion "Thank $girlfriendName for managing you.">>
<<set $flags.finalRankingSeen = true>>
<<set $flags.ownedPublicRoleAccepted = true>>
<<run setup.applyIdentity("final-label-thank")>>
<<run setup.peakArousal()>>
<<actor girlfriend>>
Aww. You're welcome.
I'll explain the difference between a council result and my rules at home.
<</actor>>
<div class="delayed continue-links">[[Check the final board|Class board]] [[Follow your keyholder home|Home]]</div>
<</identity-choice>>
</div>
</div>
<</nobr>><<nobr>>
<<set $flags.fieldSurveyOpen = true>>
<<set $flags.questHint = "Field interviews: Park (before 22:00) and step-sister (before 18:00).">>
<img class="hero-img centered" @src="setup.ImagePath+'story/act1/day5-field-park.jpg'" alt="field survey work">
/* --- Social --- */
<p class="delayed">
Before class, your group clusters near the lockers. $exfriendName has a clipboard like he was born holding one.
</p>
<<actor exfriend>>
So... we agreed that everybody runs the survey on at least two people and brings back real answers we can use as data.
<</actor>>
<<actor bestfriend>>
Define "real." People will say whatever makes them sound smart.
<</actor>>
<<actor bully>>
Then ask louder or smile more; either works for me.
<</actor>>
<<actor girlfriend>>
Be nice. We need clean results for $teacherName, not a fight in the park.
<</actor>>
/* --- Class --- */
<p class="delayed">Class is mostly project time. $teacherName moves from group to group, checking every page.</p>
<<actor teacher>>
Fieldwork shows me who can approach strangers and get useful answers. I expect each of you to complete the assignment without excuses.
<</actor>>
<<actor-thought you>>
She looks at you a second too long after mentioning excuses. Heat spreads up your neck under her attention.
<</actor-thought>>
<<actor bully>>
If your boyfriend freezes up in the park, $girlfriendName, I'll handle the charm portion.
<</actor>>
<<actor girlfriend>>
He won't freeze. He'll do what the project needs.
<</actor>>
<<actor-thought you>>
She promises the group that you will do what the project needs. Your cock stirs at being managed in public, and you hate the reaction.
<</actor-thought>>
<<run setup.nudgeArousal(12)>>
/* --- Private --- */
<<actor exfriend>>
Assignments: $youName, two subjects minimum. $girlfriendName and I will handle online if needed.
<</actor>>
<<actor you>>
I'll ask my step-sister. And someone at the park.
<</actor>>
<<actor girlfriend>>
Good, text the group when you're done. And... be careful how you phrase the questions, because people copy your energy.
If someone answers like an alpha, write it down. If they look at you like a beta... write that down too.
<</actor>>
<span id="conv"></span>
<div id="options">
<<identity-choice resistance "The survey already steers people toward ANWO.">>
<<actor exfriend>>That's called design. We want a good grade, not a philosophy degree.<</actor>>
<<actor girlfriend>>Just do your two. We can argue ethics after the A.<</actor>>
<<actor-thought you>>
She squeezes your wrist, soft, dismissive, intimate. The argument dies in your throat.
<</actor-thought>>
<div class="delayed">[[Leave school|After school][_ab = setup.applyIdentity("act1-day5-object"); _public = setup.applyRecognition("act1-day5-object")]]</div>
<</identity-choice>>
<<you-choice "Okay. Two people. Easy.">>
<<actor bully>>Look at the team player. Don't mess it up.<</actor>>
<<actor-thought you>>
Easy. You already know your sister will support the new system. The park is the wild card.
<</actor-thought>>
<div class="delayed">[[Leave school|After school]]</div>
<</you-choice>>
<<you-choice "Stay quiet. Nod.">>
<<actor girlfriend>>You've got that look. Don't overthink it... just collect smiles and yeses.<</actor>>
<<actor-thought you>>
Nodding is easier than being the problem again.
<</actor-thought>>
<div class="delayed">[[Leave school|After school][_public = setup.applyRecognition("act1-day5-nod")]]</div>
<</you-choice>>
</div>
<</nobr>><<nobr>>
<<if !$flags.surveyPark or !$flags.surveySister>>
<<set $flags.questHint = "Finish both surveys: Park (before 22:00) and step-sister in the morning.">>
<<actor-thought you>>
I still need the park survey and $sisterName's answers before this day counts.
<</actor-thought>>
<div class="continue-links">
[[Go do the surveys|Home][$schoolDay = 8; $gameDate = setup.changeDate($gameDate, 'hours', 2)]]
</div>
<<else>>
<<set $flags.questHint = "">>
<img class="hero-img centered" @src="setup.ImagePath+'story/act1/day8-results-table.jpg'" alt="survey results compilation">
/* --- Social --- */
<p class="delayed">
Your group meets at the back tables with laptops open and the survey totals spread across three screens. Everyone looks too pleased with the numbers.
</p>
<<actor you>>
I've finished my interviews. $sisterName was strongly positive. The park group was mixed, mostly uneasy about rankings in school.
<</actor>>
<<actor girlfriend>>
Same... mostly positive, one holdout. She called it "playful power," then laughed like she was joking.
<</actor>>
<<actor bully>>
Five positive, one neutral, one negative. The negative was a guy. Shocking.
<</actor>>
<<actor bestfriend>>
Mine were fine. Call it "safety" and people agree before they think about what it means.
<</actor>>
/* --- Class / report --- */
<<actor exfriend>>
I posted the survey online. Twenty thousand responses. Eighteen thousand positive. Fifteen hundred neutral. Five hundred negative. /* prose-ok: spoken data list */
<</actor>>
<<actor you>>
Twenty thousand? A class assignment should not reach that many people. Someone is going to treat this as evidence.
<</actor>>
<<actor exfriend>>
That's an A. $teacherName wants "significant results." We delivered.
<</actor>>
<<actor teacher>>
I can hear the enthusiasm from here. Compile the results carefully and submit them today. The student council has asked to review the strongest projects.
<</actor>>
/* --- Private --- */
<<actor-thought you>>
The questions were skewed. You said so. They smiled and kept stacking yeses.
If this leaves the classroom, it won't be a joke anymore.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<identity-choice resistance "We should flag the bias before we submit.">>
<<actor bestfriend>>And fail? You found your ethics after we did all the work. No.<</actor>>
<<actor girlfriend>>Please don't do this here. We'll look like we sabotaged our own work.<</actor>>
<<actor bully>>Man wants to confess before the crime is even fun. Sit down.<</actor>>
<<actor bestfriend>>Sit. Smile. Pretend you have a spine later.<</actor>>
<div class="delayed">[[Submit anyway|School 8 Day anwo submit][$flags.day8SpokeUp = true; $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1); _ab = setup.applyIdentity("act1-day8-object"); _public = setup.applyRecognition("act1-day8-object")]]</div>
<</identity-choice>>
<<you-choice "Fine. Submit it. I want the grade.">>
<<actor girlfriend>>Smart. We can sleep at night after the score posts.<</actor>>
<<actor-thought you>>
Your mouth goes dry as the packet leaves your hands. You agreed to submit it, and that fact will follow you.
<</actor-thought>>
<div class="delayed">[[Hand in the packet|School 8 Day anwo submit][$flags.day8SpokeUp = false]]</div>
<</you-choice>>
<<identity-choice devotion "Look at $girlfriendName for a cue.">>
<<actor girlfriend>>Submit. We'll talk later, if there's anything to talk about.<</actor>>
<<actor-thought you>>
Her eyes say: don't be the problem in public.
<</actor-thought>>
<div class="delayed">[[Follow her lead|School 8 Day anwo submit][$flags.day8SpokeUp = false; _ab = setup.applyIdentity("act1-day8-defer"); _public = setup.applyRecognition("act1-day8-defer")]]</div>
<</identity-choice>>
</div>
<</if>>
<</nobr>><<nobr>>
<<set $flags.day8Submitted = true>>
<<set $flags.questHint = "">>
<<if $flags.day8SpokeUp>>
<<actor exfriend>>
For the record: I'm submitting the clean packet. Your little speech didn't make the PDF.
<</actor>>
<<actor-thought you>>
Of course it didn't. They removed your objection and submitted the version they wanted.
<</actor-thought>>
<<actor girlfriend>>
Hey. I know you meant well. Just... don't make us targets before we have to be.
<</actor>>
<p class="delayed">A soft squeeze of your hand under the table, then she lets go.</p>
<<else>>
<<actor exfriend>>
Packet's in. Smile for the photo if $teacherName wants one.
<</actor>>
<<actor girlfriend>>
See? Easy. You did your part. That's enough for today.
<</actor>>
<</if>>
<<actor teacher>>
Excellent work, group. I expect the rest of the class to study your methods.
<</actor>>
<<actor teacher>>
And $exfriendName... if those online numbers hold, I may share them beyond this room. Significant results deserve an audience.
<</actor>>
<<actor-thought you>>
She is talking about an audience beyond the classroom, and your stomach turns.
<</actor-thought>>
<<set $flags.questHint = "Phone: the project might go public. Check the group chat.">>
<div class="delayed">
[[Leave school|After school]]
</div>
<</nobr>><<nobr>>
<<set _daysSinceLoopStart = $schoolDay - 26>>
<img class="hero-img centered" @src="setup.ImagePath+'places/school.jpg'" alt="school morning">
<<if $caged && $flags.ultimateHumiliationDone>>
<<actor-thought you>>
Another school morning. The cage presses against you as $girlfriendName walks ahead, the key visible at her collarbone.
You match her pace through the hallway and try not to wonder what she has planned for the week.
<</actor-thought>>
<<elseif $caged>>
<<actor-thought you>>
Another morning in the same hallway, with the same lock rubbing under your jeans. It feels different now because more people know.
<</actor-thought>>
<<else>>
<<actor-thought you>>
Another school morning. The project deadline is close, and the council will soon close this ranking cycle. You know the routine now, though it still makes you anxious.
<</actor-thought>>
<</if>>
/* One focused beat per quiet school day. */
<<set _loopBeat = Math.abs($schoolDay || 0) % 3>>
<img class="hero-img centered delayed" @src="setup.ImagePath+'story/act1/school-week-loop-classroom.jpg'" alt="The teacher continuing the weekly seminar">
<<if $flags.noAlphaBoundary && $flags.noAlphaRelationshipDone>>
<<actor girlfriend>>We agreed on the boundary. Finish class, stay close, and stop watching the hallway every time someone laughs.<</actor>>
<<actor bestfriend>>He said no other men. He did not say I had to stop making fun of him.<</actor>>
<<elseif $flags.finalRankingSeen>>
<<if _loopBeat eq 0>>
<<actor teacher>>The project cycle is closed. Your public ranking remains live, and later work may still change it.<</actor>>
<<actor exfriend>>The audit log still needs both source files. I need your park notes before lunch, not another argument about the board.<</actor>>
<<elseif _loopBeat eq 1>>
<<actor girlfriend>>The class result is done. Stay close, help me finish the archive, and stop checking whether everyone remembers the key photo.<</actor>>
<<actor bestfriend>>They remember. I made sure the useful people did.<</actor>>
<<else>>
<<actor bully>>Project is over. Friday is not. Handle your school work before your wallet gets another assignment.<</actor>>
<</if>>
<<elseif $flags.day37SlideDecision>>
<<if $flags.day37SlideDecision eq "warn">>
<<actor girlfriend>>I have the final deck. $bestfriendName can complain after we get the grade.<</actor>>
<<elseif $flags.day37SlideDecision eq "document">>
<<actor exfriend>>Keep the edit-history photo. If the private slide returns, evidence matters more than who laughs first.<</actor>>
<<else>>
<<actor bestfriend>>You left my slide in the deck. Do not act surprised when the room finally sees it.<</actor>>
<</if>>
<<elseif $flags.day31DataAuditDone>>
<<if $flags.day31Contribution eq "corrected">>
<<actor exfriend>>Your name is on the correction. Be ready to explain it instead of making me do it for you.<</actor>>
<<elseif $flags.day31Contribution eq "shared">>
<<actor exfriend>>We share the correction, so we share the question. Bring the original notes.<</actor>>
<<else>>
<<actor girlfriend>>You fixed the totals quietly. Today you tell the group it was your work before the draft forgets you.<</actor>>
<</if>>
<<elseif _loopBeat eq 0>>
<<actor teacher>>Keep working on the project. Every claim in the final deck must trace back to a source.<</actor>>
<<elseif _loopBeat eq 1>>
<<actor girlfriend>><<if $girlfriendTrustLevel gte 7>>Morning, baby. Stay close and help me finish the group notes.<<elseif $girlfriendTrustLevel lte 3>>Walk with me, keep quiet, and get to class.<<else>>Morning. Relax when you walk and keep up.<</if>><</actor>>
<<else>>
<<actor bestfriend>>The deadline is close. Try contributing something $girlfriendName does not have to fix for you.<</actor>>
<</if>>
<<run setup.nudgeArousal(random(4, 8))>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 6)>>
<</nobr>>
<div class="continue-links">
[[Leave school|After school][$schoolDay += 1]]
<<if setup.classRankingHasUpdate()>>
[[Check the ranking board|Class board][$schoolDay += 1]]
<</if>>
</div><<nobr>>
/* Date-prep renders inside this history moment, avoiding a routing-only passage. */
<<if setup.trySisterDatePrep()>>
<<include "Sister date lingerie">>
<<else>>
<img class="hero-img centered" @src="setup.ImagePath+'story/late/sister-visit.jpg'" alt="step-sister">
<<if $caged>>
<p class="delayed">$sisterName looks you over like she's inventorying metal under cotton.</p>
<<elseif $world eq "anwo">>
<p class="delayed">$sisterName is half-dressed for the day and fully ready to judge you.</p>
<<else>>
<p class="delayed">Your step-sister leans in the doorway, bored and dangerous in a normal way.</p>
<</if>>
<<set _sisSurveyReady = !$flags.surveySister && $gameDate.getHours() lt 18 && ($flags.fieldSurveyOpen || $flags.surveyPark || hasVisited("School 5 Day anwo"))>>
<<if _sisSurveyReady>>
<div class="quest-banner">
<strong>Field survey</strong>
<p>$sisterName is free enough to take your ANWO questionnaire.</p>
[[Run survey with step-sister|Survey - Ask step-sister]]
</div>
<<elseif !$flags.surveySister && ($flags.fieldSurveyOpen || hasVisited("School 5 Day anwo")) && $gameDate.getHours() gte 18>>
<p class="hint-line">She's busy later in the day. Try again before 18:00.</p>
<<elseif !$flags.surveySister && $flags.day3SurveyDone && !$flags.fieldSurveyOpen && !hasVisited("School 5 Day anwo")>>
<p class="hint-line">Field interviews aren't assigned yet. Wait for the school assignment.</p>
<</if>>
<<if _sisSurveyReady>>[[Run survey with step-sister|Survey - Ask step-sister]]<</if>>
<<if $caged>>[[Help step-sister]]<</if>>
<<if $caged && $sisterTaskChapter gte 1>><<link `"Quick check-in with " + $sisterName` "Sister small talk">><</link>><</if>>
[[Home]]
<</if>>
<</nobr>><<nobr>>
<<actor you>>
Hey $sisterName, do you have a moment for a quick survey about ANWO?
<</actor>>
<<actor sister>>
ANWO? Is that a cult, a diet, or a dating app for people who like rankings?
<</actor>>
<<actor you>>
Alpha New World Order. It's a class project about alphas leading while betas... follow.
<</actor>>
<<actor sister>>
Oh, hierarchy cosplay. Sure... I'm in, because I love a questionnaire that flatters power.
<</actor>>
<p class="delayed">After the survey...</p>
<<actor you>>
You scored full points. How?
<</actor>>
<<actor sister>>
Because I believe in strong leadership, and in what happens when a strong man folds.
A guy who used to posture ending up polite and useful? Big improvement.
Not that I'm speaking from experience.
<</actor>>
<<actor you>>
Okayyy... thanks anyway.
<</actor>>
[[Home][$flags.surveySister = true; $flags.questHint = ""; $gameDate = setup.changeDate($gameDate, 'hours', 1)]]
<</nobr>><<nobr>>
<<switch $sisterTaskChapter>>
<<case 0>>
<<include "Sister visit 1 panties">>
<<case 1>>
<<include "Sister visit 2 clean">>
<<case 2>>
<<include "Sister visit 3 key talk">>
<<default>>
<<include "Sister visit chores">>
<</switch>>
<</nobr>><<nobr>>
<img class="hero-img centered" @src="setup.ImagePath+'story/late/sister-visit.jpg'" alt="step-sister visit">
<<actor sister>>
Oh, brother. Look at you, still trying to hide that cage under your clothes.
<</actor>>
<<actor sister>>
I handed $girlfriendName the solution. She actually used it. I am weirdly proud and very entertained.
<</actor>>
<<actor sister>>
Task time. Put on my dirty panties over the cage. Photo stays on my phone, not the group chat... unless you bore me.
<</actor>>
<<actor sister>>
Refuse and I tell her you have been rubbing the cage whenever nobody is looking.
<</actor>>
<span id="conv"></span>
<div id="options">
<<you-choice "No. I am not doing that.">>
<<actor sister>>
Okay. Your girlfriend will hear from me.
<</actor>>
[[See ya|Home][$relationshipState = "girlfriend-mad"; $girlfriendMadReason = "$sisterName told me you have been rubbing your cage like a junkie."]]
<</you-choice>>
<<you-choice "Fine. Just... do not show anyone.">>
<img class="centered delayed" @src="setup.ImagePath+'you/chastity-panty.png'">
<<actor sister>>
Gorgeous. Soft boy fashion. $girlfriendName would laugh and then keep you.
<</actor>>
<<actor-thought you>>
The warm fabric drags across the cage when you move. You hold still while she takes the photo.
<</actor-thought>>
[[Thanks...|Home][$sisterTaskChapter = 1; $flags.sisterVisit1 = true]]
<</you-choice>>
</div>
<</nobr>><<nobr>>
<img class="hero-img centered" @src="setup.ImagePath+'story/late/sister-visit.jpg'" alt="step-sister visit">
<<actor sister>>
Hey, loser. Still sore from the cage?
<</actor>>
<<actor sister>>
I need my room clean before my friend comes over. You will do it quietly, and if he arrives early, keep your eyes down and stay out of his way.
<</actor>>
<<actor sister>>
Pay is ten bucks and me not inventing new crimes for $girlfriendName.
<</actor>>
<span id="conv"></span>
<div id="options">
<<you-choice "I will clean. Keep her out of it.">>
[[Clean her room|Sister clean room]]
<</you-choice>>
<<you-choice "I am not your maid.">>
<<actor sister>>
Then I send one text and let your girlfriend deal with you.
<</actor>>
[[Leave|Home][$relationshipState = "girlfriend-mad"; $girlfriendMadReason = "$sisterName says you are a lazy locked brat who will not even help family."]]
<</you-choice>>
</div>
<</nobr>><<nobr>>
<img class="centered" @src="setup.ImagePath+'sister/room-cleaning.webp'">
<p class="delayed">You wipe down the room while she scrolls on her bed. Whenever she spots dust, she points without looking up from her phone.</p>
<<actor sister>>
Nice work, maid. Here is ten. Do not spend it all on lube you will never use properly.
<</actor>>
<<if $backpack.has("apology-gift")>>
<<actor sister>>
Cute... you bought $girlfriendName something. Bribery is a love language. She will like that.
<</actor>>
<</if>>
[[Thanks|Home][$money += 10; $sisterTaskChapter = 2; $flags.sisterVisit2 = true; $gameDate = setup.changeDate($gameDate, 'hours', 1)]]
<</nobr>><<nobr>>
<img class="hero-img centered" @src="setup.ImagePath+'story/late/sister-visit.jpg'" alt="step-sister key talk">
<<actor sister>>
Be serious for one minute. I can make fun of you again after.
<</actor>>
<<actor sister>>
$girlfriendName asked me if dual keyholding is a thing. I said only if she wants drama.
I do not want her key. The photos already give me enough leverage.
<</actor>>
<<actor sister>>
So here is the deal: I keep quiet about your little panty portfolio. You keep being useful, errands, cash, ego snacks.
If you ever get unlocked and act big, I remind everyone who dressed you.
<</actor>>
<span id="conv"></span>
<div id="options">
<<you-choice "Deal. Just do not ruin us.">>
<<actor sister>>
"Us" is cute. You mean her. Fine, I will stay out of the way for now.
<</actor>>
[[Home][$sisterTaskChapter = 3; $flags.sisterVisit3 = true; $girlfriendTrustLevel = setup.changeFavor(1)]]
<</you-choice>>
<<you-choice "You are enjoying this too much.">>
<<actor sister>>
Obviously. You used to act so confident, and now you fold my laundry in a cage. Why would I look away?
<</actor>>
[[Home][$sisterTaskChapter = 3; $flags.sisterVisit3 = true]]
<</you-choice>>
<<you-choice "Tell $girlfriendName I want her to hold the only key. Not you.">>
<<actor sister>>
Aww, loyalty. I will text her you said that. She will melt... or tighten the schedule, so I win either way.
<</actor>>
[[Home][$sisterTaskChapter = 3; $flags.sisterVisit3 = true; $girlfriendTrustLevel = setup.changeFavor(2)]]
<</you-choice>>
</div>
<</nobr>><<nobr>>
<img class="hero-img centered" @src="setup.ImagePath+'story/late/sister-visit.jpg'" alt="step-sister chores">
<<actor sister>>
I have chores and you have free time. Pick one, locked boy.
<</actor>>
[[Clean her room (again)|Sister clean room free]]
[[Just talk|Sister small talk]]
[[Home]]
<</nobr>><<nobr>>
<img class="centered" @src="setup.ImagePath+'sister/room-cleaning.webp'">
<<actor sister>>
Adequate. Here is five for not crying about it.
<</actor>>
[[Home][$money += 5; $gameDate = setup.changeDate($gameDate, 'hours', 1)]]
<</nobr>><<nobr>>
<<actor sister>>
You are quieter since the cage. Suits you.
Do not ask me for the key. I never took it. I just like knowing you wonder.
<</actor>>
<<if $caged>>
<<actor sister>>
$girlfriendName is lucky to have someone this obedient. You probably think you are the lucky one.
<</actor>>
<</if>>
[[Home][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]
<</nobr>><<nobr>>
/* Random interrupt while jerking, mean practical, not soft. Cooldown set in trySisterJerkInterrupt. */
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/late/sister-walk-in.jpg'" alt="sister walk-in">
<p class="delayed">You left the door unlocked. $sisterName stops halfway into the room, looks from your hand to your face, and slowly starts to grin.</p>
<<actor sister>>
Oh my god.
Really, in the middle of the day? That is gross and hilarious.
<</actor>>
<<if $caged>>
<<actor sister>>
Wait, the cage is still on and you are still trying?
That is so pathetic. Keep going... actually, stop. I have a better idea.
<</actor>>
<<else>>
<<actor sister>>
Hands off. Now. I am not watching you finish like a podcast.
You got caught. That means you owe me.
<</actor>>
<</if>>
<<actor-thought you>>
Your hand stays frozen over your lap. $sisterName folds her arms and waits for you to answer.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<if $caged>>
<<you-choice "Put her dirty panties over the cage while she films a three-second laugh.">>
<img class="centered delayed" @src="setup.ImagePath+'you/chastity-panty.png'" alt="">
<<actor sister>>
Fashion. Soft boy couture.
If $girlfriendName asks, I will say you volunteered. Because you did. Just now.
<</actor>>
<<run setup.nudgeArousal(10)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<p class="delayed">She leaves snickering. You pull off the warm fabric and shove it under the covers.</p>
<div class="delayed">[[Hide under the covers|Home]]</div>
<</you-choice>>
<<you-choice "Rub the cage while she mocks you until she says stop.">>
<<actor sister>>
Faster... no, slower. Look at me when you rattle.
That is enough. Stop and put your hands up while you suffer.
<</actor>>
<<run setup.peakArousal()>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<p class="delayed">Your hands remain raised while the ache builds. She snaps one last photo and calls the exercise good for you.</p>
<div class="delayed">[[Ache in silence|Home]]</div>
<</you-choice>>
<<you-choice "Beg her not to tell $girlfriendName, do her laundry as payment.">>
<<actor sister>>
Deal. Basket is by the door.
And if you "forget," I invent a worse version for her.
<</actor>>
<<run setup.nudgeArousal(8)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<p class="delayed">You fold her clothes while the cage digs into your lap. She unfolds one shirt just to make you redo the corners.</p>
<div class="delayed">[[Done. Still hard.|Home]]</div>
<</you-choice>>
<<else>>
<<you-choice "Finish while she watches and rates you like a bad sport.">>
<<actor sister>>
Wow, that was sad... maybe two out of ten for effort.
Wipe up, then stay out of the hallway until I forget I saw that.
<</actor>>
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<p class="delayed">You finish while she watches with folded arms. When you look away, she gives your performance another two out of ten.</p>
<div class="delayed">[[Crawl into a hole (Home)|Home]]</div>
<</you-choice>>
<<you-choice "Stop mid-stroke. She makes you apologize on your knees.">>
<<actor sister>>
"Sorry for being a gross little pervert in a shared house."
Say it louder. Good boy... wait, no, gross boy. That is close enough.
<</actor>>
<<run setup.nudgeArousal(12)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<p class="delayed">You stay on your knees after the apology. She walks out and deliberately leaves the door open.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Text $girlfriendName what $sisterName dictates.">>
<<actor sister>>
Type: "got caught by $sisterName. i am pathetic."
Send it, then show me. Perfect, she is going to love that.
<</actor>>
<<set $girlfriendTrustLevel = Math.max(0, ($girlfriendTrustLevel || 0) - 1)>>
<<run setup.nudgeArousal(8)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<p class="delayed">The read receipt appears almost at once. Your stomach drops while $sisterName checks the wording over your shoulder and nods with satisfaction.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<</if>>
</div>
</div>
<</nobr>><<nobr>>
/* Random 1-in-X when visiting step-sister: date-night outfit, alpha pickup soon. Cooldown in trySisterDatePrep. */
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'sister/date-ready.jpg'" alt="step-sister dressed for a date">
<p class="delayed">You knock but enter before she answers. $sisterName is fastening an earring at the full-length mirror, dressed in a tight black dress and heels. Her perfume fills the room, and her bag is already waiting on the bed.</p>
<<actor sister>>
Knocking is a concept, loser.
Relax, I'm dressed. The naked part comes after the restaurant, if he earns it.
<</actor>>
<<actor-thought you>>
The dress clings to her hips. She catches you looking in the mirror and takes her time adjusting it.
<</actor-thought>>
<<actor sister>>
The guy is tall, pays for dinner, and orders without making it a group discussion.
He's picking me up in like twenty. So either help or gawk from the door like a haunted house prop.
<</actor>>
<<if $caged>>
<<actor sister>>
Oh right, you're locked downstairs. Cute.
If he texts that he is close, I might leave you in the hall so he never has to meet you.
<</actor>>
<<elseif $world eq "anwo">>
<<actor sister>>
ANWO would put him well above you. While I wait for someone who can use his hands, you can make yourself useful.
<</actor>>
<</if>>
<span id="conv"></span>
<div id="options">
<<you-choice "Ask who he is. Try not to sound jealous.">>
<<actor you>>
So uh... who is he?
<</actor>>
<<actor sister>>
Someone who does not need a survey to know he's above you.
He's taking me somewhere loud and good. If I'm late back, assume I'm busy. Don't text me "you okay?" like a mom.
<</actor>>
<<run setup.nudgeArousal(8)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<p class="delayed">She checks her phone, smiles at a name you do not get to see, and shoos you out with two fingers.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Offer to zip her / grab her bag. Soft servant mode.">>
<<actor you>>
I can... zip you, or get your bag. Whatever you need.
<</actor>>
<<actor sister>>
Wow. Useful for once.
Bag's on the bed, and don't sniff anything. Actually, wait... look at me in the mirror. Yeah, that's the face of a guy who knows he's not coming.
<</actor>>
<<run setup.nudgeArousal(10)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<p class="delayed">You bring her the clutch. She takes it with a pitying smirk, then closes the door in your face so she can finish getting ready.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Stare too long. She catches you and rates the dress.">>
<<actor sister>>
Eyes up. Or don't. I paid for this silhouette.
Rate me out loud, one to ten. If you say ten, I'm calling you a liar and a simp.
<</actor>>
<<actor you>>
...Nine, okay, fine, ten, which makes me a liar.
<</actor>>
<<actor sister>>
Correct. He's getting the ten. You're getting the hallway.
Under this? Black lace, and none of your business. Have fun imagining it while I'm out.
<</actor>>
<<run setup.nudgeArousal(12)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<p class="delayed">She turns once in front of the mirror. Your eyes follow the dress, and she catches you staring before sending you into the hallway.</p>
<div class="delayed">[[Leave before he arrives|Home]]</div>
<</you-choice>>
<<if $caged>>
<<you-choice "Beg her not to tell $girlfriendName you walked in staring.">>
<<actor sister>>
Oh I might.
Or I might say my locked little step-bro almost creamed the carpet because I put on heels.
Behave and I keep it cute. Act weird and I send her a voice note.
<</actor>>
<<run setup.nudgeArousal(10)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<p class="delayed">You back out of the room, sore with every step. A car horn sounds downstairs, and she smiles as she reaches for her bag.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<</if>>
<<you-choice "Mumble sorry and leave before he shows.">>
<<actor sister>>
Smart. First good choice all day.
Don't wait up. Don't "check the driveway." Go be soft somewhere else.
<</actor>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<run setup.nudgeArousal(6)>>
<p class="delayed">You leave with her perfume clinging to your shirt. Behind you, she closes the door and turns the lock.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</nobr>><<nobr>>
/* Legacy hub removed */
<div class="scene-panel compact"><p class="scene-lead">Nothing to do here right now.</p><div class="continue-links">[[Home]]</div></div>
<</nobr>><<nobr>>
<div class="scene-panel compact"><p class="scene-lead">Nothing to do here right now.</p><div class="continue-links">[[Home]]</div></div>
<</nobr>><<nobr>>
<<if setup.hustleStatus("beg") neq "open">>
<div class="scene-panel compact"><p class="scene-lead">Nothing to do here right now.</p><div class="continue-links">[[Home]]</div></div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/hustles/beg-allowance.jpg'" alt="beg for allowance">
<<actor girlfriend>>
You need cash again? Fine, ask me properly, and don't try "Hey, can I borrow some?"
You know what I want to hear.
<</actor>>
<span id="conv"></span>
<div id="options">
<<you-choice "Please, keyholder... I need allowance for your errands.">>
<<actor girlfriend>>
That's better. Don't spend it on yourself before you finish my errands.
<</actor>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<set _pay = setup.completeHustle("beg")>>
<p class="delayed">A transfer of <strong>$<<= _pay>></strong> reaches your account.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Can you just send money? I'm short.">>
<<actor girlfriend>>
That was lazy. You get half, and next time you can ask with some manners.
<</actor>>
<<set $money += 12>>
<<set $flags.hustleUnlocked = true>>
<<set $flags.hustleLastDayNum = $day>>
<<if !$hustleLastDone>><<set $hustleLastDone = {}>><</if>>
<<set $hustleLastDone["beg"] = $day>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<p class="delayed">She sends only <strong>$12</strong>. The smaller transfer stings more than it should.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if setup.hustleStatus("school-bags") neq "open">>
<div class="scene-panel compact"><p class="scene-lead">Nothing to do here right now.</p><div class="continue-links">[[Home]]</div></div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/hustles/carry-bags.jpg'" alt="carry bags">
<p class="delayed">Before first period, $girlfriendName hooks her bag over your shoulder without asking. $bestfriendName laughs and drops hers on top, forcing you to catch both straps.</p>
<<actor girlfriend>>
Walk normal.
If anyone asks, you're being useful.
<</actor>>
<<actor bestfriend>>
Aww, she brought me a locked pack mule.
Don't drop my stuff, loser.
<</actor>>
<span id="conv"></span>
<div id="options">
<<you-choice "I've got them. Let's go.">>
<<actor girlfriend>>
I'll tip you for getting them there without embarrassing me.
<</actor>>
<<set _pay = setup.completeHustle("school-bags")>>
<p class="delayed">She slips <strong>$<<= _pay>></strong> into a side pocket while both bags remain on your shoulders.</p>
<<include "Hustle school exit">>
<</you-choice>>
<<you-choice "Both bags? Seriously?">>
<<actor bestfriend>>
Yeah, seriously. Move.
<</actor>>
<<actor girlfriend>>
You can complain while you carry them. I'm still paying you.
<</actor>>
<<set _pay = setup.completeHustle("school-bags")>>
<p class="delayed">She pays you <strong>$<<= _pay>></strong> when you reach the classroom. Your shoulders ache, and $bestfriendName adds another laugh before taking her bag.</p>
<<include "Hustle school exit">>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if setup.hustleStatus("bags") neq "open">>
<div class="scene-panel compact"><p class="scene-lead">Nothing to do here right now.</p><div class="continue-links">[[Home]]</div></div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/hustles/carry-bags.jpg'" alt="carry bags">
<p class="delayed">In the mall corridor, $girlfriendName keeps adding shopping bags until the handles dig into both forearms.</p>
<<actor girlfriend>>
Don't drop anything.
If someone stares, smile. You're my boyfriend, so you carry my bags.
<</actor>>
<<actor-thought you>>
The cage presses beneath your jeans while lace tags peek from a bag meant for someone else to enjoy.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "Yes. I've got them.">>
<<actor girlfriend>>
You managed it. I'll tip you for not embarrassing me.
<</actor>>
<<set _pay = setup.completeHustle("bags")>>
<p class="delayed">She peels off <strong>$<<= _pay>></strong> and presses it into your palm before taking the bags.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "This is a lot...">>
<<actor girlfriend>>
Then hold them tighter. I'm paying you, so keep walking.
<</actor>>
<<set _pay = setup.completeHustle("bags")>>
<p class="delayed">She puts <strong>$<<= _pay>></strong> in your pocket after you carry everything through the food court. Several people watched you struggle.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if setup.hustleStatus("bully-coffee") neq "open">>
<div class="scene-panel compact"><p class="scene-lead">Nothing to do here right now.</p><div class="continue-links">[[Home]]</div></div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/hustles/bully-coffee.jpg'" alt="coffee for the bully">
<<actor girlfriend>>
He wants coffee, and you're closer. Go get it.
Don't make that face. He's paying, and you need the cash.
<</actor>>
<p class="delayed">You find $bullyName lounging outside in the shade. He barely looks up from his phone when you approach.</p>
<<actor bully>>
Damn, she really sent the locked one. Get me a large black coffee and don't spill it.
<</actor>>
<span id="conv"></span>
<div id="options">
<<you-choice "...Okay. One black large.">>
<p class="delayed">You buy the coffee and hand it over. His fingers close around the cup without touching yours.</p>
<<actor bully>>
Damn, you actually did it. Here's something for the walk.
<</actor>>
<<set _pay = setup.completeHustle("bully-coffee")>>
<<run setup.nudgeArousal(8)>>
<p class="delayed">He drops <strong>$<<= _pay>></strong> into your open palm and turns back to his phone.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Why am I doing this?">>
<<actor bully>>
Because she said so. And you like money more than pride. Move.
<</actor>>
<<set _pay = setup.completeHustle("bully-coffee")>>
<p class="delayed">He laughs as you leave, but still tips you <strong>$<<= _pay>></strong>.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if setup.hustleStatus("alessia-shoe") neq "open">>
<div class="scene-panel compact"><p class="scene-lead">Nothing to do here right now.</p><div class="continue-links">[[Home]]</div></div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/hustles/alessia-shoe.jpg'" alt="shoe task">
<p class="delayed">After school, $bestfriendName sits on the sun-warmed steps and slips off one shoe. She points out the dirt along its white edge, then nudges it toward you with a grin.</p>
<<actor bestfriend>>
Oops.
You're free, right? Wipe it properly and I'll Venmo you a little allowance.
<</actor>>
<<if $girlfriendTrustLevel gte 5>>
<<actor girlfriend>>
Do it. She's being mean, but you need the money.
<</actor>>
<<else>>
<<actor girlfriend>>
Don't make a scene. Just clean it.
<</actor>>
<</if>>
<span id="conv"></span>
<div id="options">
<<you-choice "Kneel enough to wipe. Get it done.">>
<<actor bestfriend>>
There you go. Down on the step for thirty bucks.
<</actor>>
<<set _pay = setup.completeHustle("alessia-shoe")>>
<p class="delayed">The payment of <strong>$<<= _pay>></strong> arrives while you are still brushing grit from your knees.</p>
<<include "Hustle school exit">>
<</you-choice>>
<<you-choice "Wipe standing. Minimal.">>
<<actor bestfriend>>
Half-assed job, half pay. You still cleaned it, loser.
<</actor>>
<<set _pay = setup.completeHustle("alessia-shoe", { pay: 15 })>>
<p class="delayed">She sends only <strong>$<<= _pay>></strong>, then lifts the shoe to inspect your work in front of you.</p>
<<include "Hustle school exit">>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if setup.hustleStatus("used-panty") neq "open">>
<div class="scene-panel compact"><p class="scene-lead">Nothing to do here right now.</p><div class="continue-links">[[Home]]</div></div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/hustles/used-panty-assign.jpg'" alt="last night panties">
<img class="hero-img centered delayed" @src="setup.ImagePath+'you/chastity-panty.png'" alt="lace against the cage">
<<actor girlfriend>>
I have something for you to wear to school.
These panties were on the floor last night while he was in me.
Put them on under your clothes and send me a photo of the waistband against the cage before you leave.
I'll pay when I see proof.
<</actor>>
<<actor-thought you>>
The unwashed fabric is still warm from her room. When you pull it on, the lace presses her scent and his against the cage.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "Put them on. Send the photo. Go.">>
<<set $flags.wearingUsedPanty = true>>
<img class="hero-img centered delayed" @src="setup.ImagePath+'story/hustles/used-panty-worn.jpg'" alt="under clothes all day">
<<actor girlfriend>>
(text) i got the photo. walk normally, because i'll know if you spend all day squirming.
<</actor>>
<<run setup.peakArousal()>>
<<set _pay = setup.completeHustle("used-panty")>>
<p class="delayed">She transfers <strong>$<<= _pay>></strong>. You will feel the damp lace beneath your jeans until bedtime.</p>
<<include "Hustle school exit">>
<</you-choice>>
<<you-choice "Hesitate. Almost refuse.">>
<<set $flags.wearingUsedPanty = true>>
<img class="hero-img centered delayed" @src="setup.ImagePath+'story/hustles/used-panty-worn.jpg'" alt="under clothes all day">
<<actor girlfriend>>
Then you get no cash, and I tell $bestfriendName you flinched at used panties. Put them on.
<</actor>>
<<run setup.peakArousal()>>
<<set _pay = setup.completeHustle("used-panty")>>
<p class="delayed">You put them on and receive <strong>$<<= _pay>></strong>. She saves your hesitation for the next time $bestfriendName needs a laugh.</p>
<<include "Hustle school exit">>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if setup.hustleStatus("condom-drink") neq "open">>
<div class="scene-panel compact"><p class="scene-lead">Nothing to do here right now.</p><div class="continue-links">[[Home]]</div></div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/hustles/condom-drink.jpg'" alt="cleanup stipend">
<p class="delayed">That evening, $bullyName sits half-dressed on the edge of the bed while $girlfriendName loops your key around one finger. A filled condom and a stack of cash wait on the nightstand.</p>
<<actor girlfriend>>
You wanted money, so I'm paying you to clean up after him.
<</actor>>
<<actor bully>>
Open up, experiment. Don't waste any.
<</actor>>
<<actor-thought you>>
The condom tastes of rubber, salt, and what he left behind. Your cage stays shut while your mouth cleans up after the cock she chose.
<</actor-thought>>
/* Explicit cleanup beat (inbox drop → story/hustles/condom-clean.webp) */
<img class="hero-img centered porn-frame delayed" @src="setup.ImagePath+'story/hustles/condom-clean.webp'" alt="condom cleanup">
<span id="conv"></span>
<div id="options">
<<you-choice "Do it. Eyes down. Finish it.">>
<img class="hero-img centered porn-frame delayed" @src="setup.ImagePath+'story/hustles/condom-clean.webp'" alt="cleanup done">
<<actor girlfriend>>
There. You stayed still and earned your money.
<</actor>>
<<run setup.peakArousal()>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<set _pay = setup.completeHustle("condom-drink")>>
<p class="delayed">She points to <strong>$<<= _pay>></strong> on the nightstand while your throat still burns.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Gag. Still finish.">>
<img class="hero-img centered porn-frame delayed" @src="setup.ImagePath+'story/hustles/condom-clean.webp'" alt="messy cleanup">
<<actor bully>>
Messy, but it still counts.
<</actor>>
<<actor girlfriend>>
You made a mess of your face, but you finished. I'll still pay you.
<</actor>>
<<run setup.peakArousal()>>
<<set _pay = setup.completeHustle("condom-drink")>>
<p class="delayed">She gives you <strong>$<<= _pay>></strong> and watches you wipe the tears from your face.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if setup.hustleStatus("key-bully") neq "open">>
<div class="scene-panel compact"><p class="scene-lead">Nothing to do here right now.</p><div class="continue-links">[[Home]]</div></div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/hustles/key-to-bully.jpg'" alt="key lent to bully">
<p class="delayed">$girlfriendName unhooks the key from her chain. She doesn't unlock you. She holds it out to $bullyName.</p>
<<actor girlfriend>>
You can borrow it for a while.
Keep it long enough for him to understand that he doesn't get a say.
<</actor>>
<<set $flags.keyWithBully = true>>
<<actor bully>>
Damn, she's really lending me the remote.
I'm putting it in my pocket. Don't start begging.
<</actor>>
<<actor-thought you>>
The key clicks against the ring in his hand before disappearing into his pocket. Your cock remains locked, and now even $girlfriendName cannot open it until he gives the key back.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "Stay quiet while he teases the key in front of you.">>
<<actor bully>>
Look at your face. The key's warm from my pocket, and you're still not getting it. Walk.
<</actor>>
<<actor girlfriend>>
He'll tip you for the show, and then the key comes back to me.
<</actor>>
<<set $flags.keyWithBully = false>>
<<run setup.peakArousal()>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<set _pay = setup.completeHustle("key-bully")>>
<p class="delayed">He returns the key to her chain and pays you <strong>$<<= _pay>></strong>. You watch it settle against her chest and realize your hand is still clenched.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Ask for it back. Soft.">>
<<actor bully>>
Ask harder. Nah, you're still not getting it.
<</actor>>
<<actor girlfriend>>
That was the point. Next time, stay quiet until he gives it back.
<</actor>>
<<set $flags.keyWithBully = false>>
<<set $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1)>>
<<run setup.peakArousal()>>
<<set _pay = setup.completeHustle("key-bully")>>
<p class="delayed">He flicks the key back to her and still tips you <strong>$<<= _pay>></strong>. She catches it without looking away from you.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Let him pocket-check the cage while he holds the key.">>
<<actor bully>>
Damn, the cage is real. Stay locked, experiment.
<</actor>>
<<actor girlfriend>>
That was hot. You're disgusting, but at least you can earn from it.
<</actor>>
<<set $flags.keyWithBully = false>>
<<run setup.peakArousal()>>
<<set _pay = setup.completeHustle("key-bully")>>
<p class="delayed">He checks the cage through your clothes, close enough that anyone passing could notice. Then he returns the key and pays you <strong>$<<= _pay>></strong>.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</if>>
/* his-tip (Jamal store errands) cut for now, passage kept as soft stub */
<</nobr>><<nobr>>
<div class="scene-panel compact"><p class="scene-lead">Nothing to do here right now.</p><div class="continue-links">[[Home]]</div></div>
<</nobr>><<nobr>>
/* Whole passage in nobr — SC turns every source newline into <br> (was ~50 empty breaks). */
<<if not settings.muteAudio>><<audio "reception_bell" play>><</if>>
<<silently>>
/* Story cap = what is allowed; climb = slow ramp from shifts; tier = min(cap, climb) */
<<set _cap = setup.workStoryCap()>>
<<set _climb = setup.workShiftClimb()>>
<<set _tier = setup.workKinkTier()>>
<<set _shift = random(1, 5)>>
<<set _pay = setup.workShiftPay()>>
<<set _shiftsBefore = $workShiftsDone || 0>>
<<set _postKeyWork = $flags.alessiaKeyChapterDone && $flags.postKeySisterCheckinDone && !$flags.postKeyWorkCheckinDone>>
/* Still per kink tier (always show a hero; reception gif as secondary for lobby motion) */
<<if _tier gte 3>>
<<set _deskStill = "work/desk-owned.jpg">>
<<elseif _tier gte 2>>
<<set _deskStill = "work/desk-keyholder.jpg">>
<<elseif _tier gte 1>>
<<set _deskStill = "work/desk-keyholder.jpg">>
<<else>>
<<set _deskStill = "work/desk-soft.jpg">>
<</if>>
<</silently>>
<div class="scene-panel compact work-shift-panel">
<img class="hero-img centered" @src="setup.ImagePath + _deskStill" alt="hotel desk">
<img class="hero-img centered delayed" @src="setup.ImagePath + either('work/reception1.jpeg', 'work/reception2.png')" alt="hotel receptionist at the lobby desk">
/* Boss: simple, once. No jargon cards. */
<<if !$flags.workBossBriefed>>
<<set $flags.workBossBriefed = true>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'work/hotel-chef.png'" alt=""><div><span class="name-container"><span class="name">Boss</span></span><span class="content">You'll cover the desk on weekends. Show up on time, smile at the guests, and don't give anyone a reason to complain. I pay cash after each shift. Whatever is happening under your belt or on your phone is your business, as long as it stays out of mine.</span></div></div>
<<else>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'work/hotel-chef.png'" alt=""><div><span class="name-container"><span class="name">Boss</span></span><span class="content"><<if _tier gte 3>>You've been acting strange lately, but you're still reliable. That's all I need.<<elseif _tier gte 2>>You know the routine. Watch the desk, help the guests, and don't make me come looking for you.<<elseif _tier gte 1>>You look tense. Take a breath, stand up straight, and get to work.<<else>>Clock in and don't overthink it.<</if>></span></div></div>
<</if>>
<<if _postKeyWork>>
<p class="scene-lead delayed">The first shift after the key week looks exactly like the old job: reservations, key cards, and a lobby that does not care what happened in the passenger seat.</p>
<<actor girlfriend>>
(text) <<if $flags.alessiaKeyConsent eq "declined">>my key never left. the drive is done.<<elseif $flags.alessiaKeyDriveResponse eq "return-early">>you used the return rule. the key is back with me.<<else>>the hour is over. the key is back on my chain.<</if>>
finish your shift. bring coffee home. 🔐
<</actor>>
<<actor-thought you>>
A guest slides a room key across the desk. You hand it back without staring. For six hours, a key can be only part of the job.
<</actor-thought>>
<</if>>
<<if _tier gte 3>>
/* --- Owned heat: chastity + cuck flash + sissy desk humiliation --- */
<<if _shift eq 1>>
<<actor-thought you>>
You keep smiling while a honeymoon couple checks in with their hands all over each other. Your suit pants hide the cage, but they cannot stop the useless throb against it.
You confirm their suite and try not to imagine what they will do upstairs.
<</actor-thought>>
<p class="delayed">They thank you, and you tell them to enjoy their stay. When you shift behind the desk, the cage pinches and reminds you what awaits at home.</p>
<<run setup.nudgeArousal(10)>>
<<elseif _shift eq 2>>
<<actor-thought you>>
You check your phone below the desk. $girlfriendName has sent a photo of the key pinched between her fingers.
The caption reads: work hard, locked pet. no breaks for that clitty.
<</actor-thought>>
<<actor girlfriend>>
(text) stand straight. smile. remember who owns the key while you earn mall money for my lingerie. 🔐
<</actor>>
<p class="delayed">You straighten before the next guest approaches and enter their room number without looking at your phone again. The manager praises your focus while her message burns in your pocket.</p>
<<run setup.peakArousal()>>
<<elseif _shift eq 3>>
<<actor-thought you>>
A tall guest leans on the counter and laughs easily while you check his reservation. He looks nothing like $bullyName, but your body still recalls the chair in the corner.
<</actor-thought>>
<p class="delayed">You hand him a key card and watch him walk toward the elevators. Your own key remains on $girlfriendName's necklace, far beyond your reach.</p>
<<run setup.nudgeArousal(12)>>
<<elseif _shift eq 4>>
<<actor-thought you>>
In a bathroom stall, you quietly check the lock and nearly moan when it shifts. $girlfriendName told you not to touch the bars at work, but your fingers linger for half a second.
The brief contact leaves you more ashamed than relieved.
<</actor-thought>>
<p class="delayed">You wash your hands and return to the desk before anyone notices. For the rest of the shift, you smile at guests while trying not to touch yourself again.</p>
<<run setup.peakArousal()>>
<<else>>
<<if $flags.phoneUnlocked>>
<<actor girlfriend>>
(text) $bullyName asked if you're still locked at that little hotel job
i said obviously
keep smiling for the guests. you're still useless for fucking. 😈
<</actor>>
<<else>>
<<actor-thought you>>
The lobby noise starts to sound like his voice. You are still locked and working while she decides who gets her attention.
<</actor-thought>>
<</if>>
<p class="delayed">By closing time, the cage has rubbed a sore line beneath your uniform. At least the cash waiting at the end of the shift is real.</p>
<<run setup.nudgeArousal(10)>>
<</if>>
<<elseif _tier eq 2>>
/* --- Key rules: femdom texts, chastity discipline, soft cuck --- */
<<if !$flags.workPinkBriefOrdered && !setup.scoreGate(3)>>
<p class="hint-line score-gate-hint">Pink uniform rule locked: Devotion +3 required. Current: <<= setup.mindsetLabel().text>>.</p>
<</if>>
/* First time this tier: she orders the pink brief (setup, not random mid-shift dump) */
<<if !$flags.workPinkBriefOrdered && setup.scoreGate(3)>>
<<set $flags.workPinkBriefOrdered = true>>
<<set $flags.workPinkBriefOn = true>>
<img class="hero-img centered delayed" @src="setup.ImagePath+'work/pink-brief.jpg'" alt="pink brief under work slacks">
<<if $flags.phoneUnlocked>>
<<actor girlfriend>>
(text) new rule for hotel shifts
wear the pink brief under your slacks.
nobody else has to see it. i just want you feeling it every time you move. 🔐
<</actor>>
<<else>>
<<actor-thought you>>
Before you left, she ordered you to wear a pink brief under your work slacks. "It might improve your attitude," she said while pulling the soft fabric over the cage.
<</actor-thought>>
<</if>>
<p class="delayed">The brief presses against the lock beneath your stiff hotel slacks. No guest can see it, but every step makes you feel the joke she chose for you.</p>
<<run setup.nudgeArousal(10)>>
<<elseif _shift eq 1>>
<<actor-thought you>>
Her rules follow you to work: stand straight, smile, and do not let the cage rattle. A woman at the counter barely looks at you while giving her room number.
Being dismissed that easily should annoy you. Instead, it makes the cage tighten.
<</actor-thought>>
<p class="delayed">You keep your voice polite and finish checking her in while the pressure beneath your slacks grows.</p>
<<run setup.nudgeArousal(8)>>
<<elseif _shift eq 2>>
<<actor girlfriend>>
(text) edge later. not now.
if you leak in those pants i will know.
keep working. i have plans for that money. 🔐
<</actor>>
<p class="delayed">You nearly drop a guest's key card. The manager asks if you are tired, and you nod because the truth would be worse.</p>
<<run setup.peakArousal()>>
<<elseif _shift eq 3>>
<<actor-thought you>>
A couple quietly argues over whose card will pay. She takes his wallet, chooses one, and he laughs while you book their room.
You cannot stop watching how easily he lets her decide for him.
<</actor-thought>>
<p class="delayed">They leave together, still teasing each other. You adjust your slacks and call the next guest forward.</p>
<<run setup.nudgeArousal(10)>>
<<elseif _shift eq 4>>
<<actor-thought you>>
<<if $flags.workPinkBriefOn>>
The pink brief is still under your slacks because she called it attitude homework. Nobody sees it, but every seam drags across the cage when you cross the lobby.
<<else>>
The cage shifts under your slacks whenever you stand. You keep correcting your posture before the discomfort shows on your face.
<</if>>
<</actor-thought>>
<p class="delayed">After six hours of careful steps and forced smiles, your legs ache. You have earned money, though she has already decided how you will spend it.</p>
<<run setup.nudgeArousal(12)>>
<<else>>
<<actor-thought you>>
At the end of the shift, you check yourself in the bathroom and find the cage exactly as she left it.
<<if $flags.workPinkBriefOn>>The pink brief is wrinkled but still in place beneath your slacks.<</if>>
You fix your clothes, practice a harmless smile in the mirror, and return for your pay.
<</actor-thought>>
<p class="delayed">You tuck the cash envelope into your pocket and head home, where $girlfriendName still has the key.</p>
<<run setup.nudgeArousal(8)>>
<</if>>
<<elseif _tier eq 1>>
/* --- Fresh cage: chastity panic + mild femdom --- */
<<if _shift eq 1>>
<<actor-thought you>>
Your suit pants hide the cage as long as you walk normally. When a honeymoon couple approaches the desk holding hands, a dull throb presses you against the bars.
<</actor-thought>>
<p class="delayed">You book their suite and keep smiling while they discuss the hot tub. Nobody hears the faint click when you shift your weight, but you do.</p>
<<run setup.nudgeArousal(8)>>
<<elseif _shift eq 2>>
<<actor-thought you>>
The manager wants you standing whenever guests are in the lobby. After an hour, every change in posture makes the cage scrape somewhere new.
<</actor-thought>>
<p class="delayed">You invent some computer work so you can sit for a few minutes. The relief is temporary, but you need the paycheck enough to stay.</p>
<<run setup.nudgeArousal(6)>>
<<elseif _shift eq 3>>
<<actor-thought you>>
Phone buzzes. $girlfriendName. One preview word: <em>behave</em>.
<</actor-thought>>
<<actor girlfriend>>
(text) locked at work. good.
don't touch. just earn. 🔐
<</actor>>
<p class="delayed">You put the phone away and steady your hands before helping the next guest. Her order follows you through the rest of the shift.</p>
<<run setup.nudgeArousal(10)>>
<<elseif _shift eq 4>>
<<actor-thought you>>
You use a careful angle and stay quiet in the bathroom because the hotel restrooms are not private enough to risk rattling metal.
<</actor-thought>>
<p class="delayed">You finish quickly, straighten your clothes, and make it back before anyone comes looking for you.</p>
<<run setup.nudgeArousal(8)>>
<<else>>
<<actor-thought you>>
A demanding guest gives you an order, and "yes, keyholder" nearly slips out. You catch yourself, smile, and give her directions to the elevator.
<</actor-thought>>
<p class="delayed">She walks away without noticing. You remain behind the desk until it is time to collect your pay.</p>
<<run setup.nudgeArousal(6)>>
<</if>>
<<else>>
/* --- Soft desk (tier 0): mild only; light cage note if sealed but climb not there yet --- */
<<if $caged && _cap gte 1>>
<<if _shift eq 1 || _shift eq 2>>
<<actor-thought you>>
These are your first locked shifts, and the cage stays quiet under your slacks if you walk carefully. Most of the time, you can focus on the work.
<</actor-thought>>
<p class="delayed">Nobody knows. You almost forget. Then you sit wrong and remember.</p>
<<run setup.nudgeArousal(4)>>
<<else>>
<<actor-thought you>>
You greet guests, confirm their names, and assign their rooms. If you stand too long, the cage presses hard enough to break your concentration.
<</actor-thought>>
<p class="delayed">The shift passes without anyone noticing why you keep adjusting your stance.</p>
<<run setup.nudgeArousal(3)>>
<</if>>
<<elseif _shift eq 1>>
<<actor-thought you>>
You settle into the front-desk routine, checking names, assigning rooms, and smiling on cue. Today, you are only here for the money.
<</actor-thought>>
<p class="delayed">Nothing unusual happens, and the quiet shift still pays.</p>
<<elseif _shift eq 2>>
<<actor-thought you>>
A guest flirts at the counter. You keep it professional. She still talks past you to her partner like you are furniture.
<</actor-thought>>
<p class="delayed">You finish the check-in while she keeps speaking to her partner. They leave no tip, only the sting of being ignored.</p>
<<run setup.nudgeArousal(6)>>
<<elseif _shift eq 3 && $world eq "anwo">>
<<actor-thought you>>
Between check-ins, your mind drifts back to the rankings, $girlfriendName, and the project.
<</actor-thought>>
<p class="delayed">You make two small mistakes before forcing yourself to focus. The cash at the end of the shift helps.</p>
<<run setup.nudgeArousal(4)>>
<<elseif _shift eq 4>>
<<actor-thought you>>
The manager snaps for coffee. You bring it before she asks twice, then notice how fast you moved.
<</actor-thought>>
<p class="delayed">At closing, the manager hands you the usual envelope without mentioning how quickly you fetched the coffee.</p>
<<run setup.nudgeArousal(6)>>
<<else>>
<<actor-thought you>>
Even a boring shift pays for mall trips and gifts. You keep working until the lobby closes.
<</actor-thought>>
<p class="delayed">You finish the last check-in and clock out.</p>
<</if>>
<</if>>
<<set _result = setup.completeWorkShift({ pay: _pay, arousal: 2 })>>
<<set _pay = _result.pay>>
<<if _postKeyWork>><<set $flags.postKeyWorkCheckinDone = true>><<set $storyBeat = "post-key-work-checkin">><</if>>
<<if _result.climbed>>
<<run setup.nudgeArousal(4)>>
<</if>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'work/hotel-chef.png'" alt=""><div><span class="name-container"><span class="name">Boss</span></span><span class="content"><<if _result.climbed>>Here's your $<<= _pay >>. You're getting used to this place, so I'll see you next weekend.<<else>>Here's your $<<= _pay >>. I'll see you at the same time next weekend.<</if>></span></div></div>
<p class="hint-line delayed">Wallet: $<<= $money >> · weekends worked: <<= $workShiftsDone >></p>
<<set _nightlifeWork = setup.nightlifeWorkPassage()>>
<<if _nightlifeWork neq "">>
<div class="quest-banner delayed">
<strong>Someone is still in the lobby</strong>
<p><<if _nightlifeWork eq "Nightlife Hotel Contact">>The copper-haired guest has checked in often enough to remember your name. Today she waits until your boss leaves.<<elseif _nightlifeWork eq "Nightlife Hotel Discretion">>Mara left one small privacy problem for you to solve before you clock out.<<elseif _nightlifeWork eq "Nightlife Hotel Complaint">>Mara is back with a second problem and enough trust to let you handle it alone.<<else>>After weeks of small tests, Mara finally has a concrete offer.<</if>></p>
<<link "Stay a few minutes" _nightlifeWork>><</link>>
</div>
<</if>>
<div class="continue-links work-shift-links"><<if _postKeyWork>>[[Close out the week|End of content chat]]<<else>>[[Home]]<</if>></div>
</div>
<</nobr>>